xref: /petsc/src/sys/objects/destroy.c (revision 00a402e09c6d62f19dbf72eef0e53394ab690d5c)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h>  /*I   "petscsys.h"    I*/
6665c2dedSJed Brown #include <petscviewer.h>
7e5c89e4eSSatish Balay 
8b436f76fSVictor Eijkhout PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
9b436f76fSVictor Eijkhout {
10d42688cbSBarry Smith   PetscErrorCode ierr;
11d42688cbSBarry Smith   PetscInt       i;
12d42688cbSBarry Smith 
13b436f76fSVictor Eijkhout   PetscFunctionBegin;
14b436f76fSVictor Eijkhout   if (obj->intstar_idmax>0) {
15b436f76fSVictor Eijkhout     for (i=0; i<obj->intstar_idmax; i++) {
16b436f76fSVictor Eijkhout       ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr);
17b436f76fSVictor Eijkhout     }
18b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr);
19b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr);
20b436f76fSVictor Eijkhout   }
21b436f76fSVictor Eijkhout   if (obj->realstar_idmax>0) {
22b436f76fSVictor Eijkhout     for (i=0; i<obj->realstar_idmax; i++) {
23b436f76fSVictor Eijkhout       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
24b436f76fSVictor Eijkhout     }
25b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr);
26b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr);
27b436f76fSVictor Eijkhout   }
28b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax>0) {
29b436f76fSVictor Eijkhout     for (i=0; i<obj->scalarstar_idmax; i++) {
30b436f76fSVictor Eijkhout       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
31b436f76fSVictor Eijkhout     }
32b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr);
33b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr);
34b436f76fSVictor Eijkhout   }
35d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr);
36d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr);
37d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr);
38d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr);
39d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr);
40d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr);
41b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
42b436f76fSVictor Eijkhout }
43b436f76fSVictor Eijkhout 
44e30d2299SSatish Balay /*@
45e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
46e5c89e4eSSatish Balay 
47e5c89e4eSSatish Balay    Collective on PetscObject
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay    Input Parameter:
50e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
51fcfd50ebSBarry Smith          This must be cast with a (PetscObject*), for example,
52fcfd50ebSBarry Smith          PetscObjectDestroy((PetscObject*)&mat);
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay    Level: beginner
55e5c89e4eSSatish Balay 
56e5c89e4eSSatish Balay     Concepts: destroying object
57e5c89e4eSSatish Balay     Concepts: freeing object
58e5c89e4eSSatish Balay     Concepts: deleting object
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay @*/
61fcfd50ebSBarry Smith PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
62e5c89e4eSSatish Balay {
63e5c89e4eSSatish Balay   PetscErrorCode ierr;
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay   PetscFunctionBegin;
666bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
676bf464f9SBarry Smith   PetscValidHeader(*obj,1);
68fcfd50ebSBarry Smith   if (*obj && (*obj)->bops->destroy) {
69fcfd50ebSBarry Smith     ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr);
706bf464f9SBarry Smith   } else if (*obj) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",(*obj)->class_name);
71e5c89e4eSSatish Balay   PetscFunctionReturn(0);
72e5c89e4eSSatish Balay }
73e5c89e4eSSatish Balay 
74e5c89e4eSSatish Balay /*@C
75e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
76e5c89e4eSSatish Balay 
77e5c89e4eSSatish Balay    Collective on PetscObject
78e5c89e4eSSatish Balay 
79e5c89e4eSSatish Balay    Input Parameters:
80e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
81e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
82e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
83e5c89e4eSSatish Balay -  viewer - any PETSc viewer
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay    Level: intermediate
86e5c89e4eSSatish Balay 
87e5c89e4eSSatish Balay @*/
887087cfbeSBarry Smith PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
89e5c89e4eSSatish Balay {
90e5c89e4eSSatish Balay   PetscErrorCode ierr;
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay   PetscFunctionBegin;
93e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
943050cee2SBarry Smith   if (!viewer) {
953050cee2SBarry Smith     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
963050cee2SBarry Smith   }
970700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
98e5c89e4eSSatish Balay 
99e5c89e4eSSatish Balay   if (obj->bops->view) {
100e5c89e4eSSatish Balay     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
101f23aa3ddSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
102e5c89e4eSSatish Balay   PetscFunctionReturn(0);
103e5c89e4eSSatish Balay }
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay /*@C
106251f4c67SDmitry Karpeev    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
107e5c89e4eSSatish Balay 
108e5c89e4eSSatish Balay    Not Collective
109e5c89e4eSSatish Balay 
110e5c89e4eSSatish Balay    Input Parameters:
111e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
112e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
113251f4c67SDmitry Karpeev          PetscObjectTypeCompare((PetscObject)mat);
114e5c89e4eSSatish Balay -  type_name - string containing a type name
115e5c89e4eSSatish Balay 
116e5c89e4eSSatish Balay    Output Parameter:
117e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
118e5c89e4eSSatish Balay 
119e5c89e4eSSatish Balay    Level: intermediate
120e5c89e4eSSatish Balay 
1214099cc6bSBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare()
122e5c89e4eSSatish Balay 
123e5c89e4eSSatish Balay    Concepts: comparing^object types
124e5c89e4eSSatish Balay    Concepts: types^comparing
125251f4c67SDmitry Karpeev    Concepts: object type^comparpeing
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay @*/
128251f4c67SDmitry Karpeev PetscErrorCode  PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
129e5c89e4eSSatish Balay {
130e5c89e4eSSatish Balay   PetscErrorCode ierr;
131e5c89e4eSSatish Balay 
132e5c89e4eSSatish Balay   PetscFunctionBegin;
133a297a907SKarl Rupp   if (!obj) *same = PETSC_FALSE;
134a297a907SKarl Rupp   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
135a297a907SKarl Rupp   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
136a297a907SKarl Rupp   else {
137e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
138e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
139e5c89e4eSSatish Balay     PetscValidPointer(same,3);
140e5c89e4eSSatish Balay     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
141e5c89e4eSSatish Balay   }
142e5c89e4eSSatish Balay   PetscFunctionReturn(0);
143e5c89e4eSSatish Balay }
144e5c89e4eSSatish Balay 
1452b12f010SJed Brown /*@C
1464099cc6bSBarry Smith    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
1474099cc6bSBarry Smith 
1484099cc6bSBarry Smith    Not Collective
1494099cc6bSBarry Smith 
1504099cc6bSBarry Smith    Input Parameters:
1514099cc6bSBarry Smith +  mat - the matrix
1524099cc6bSBarry Smith -  type_name - string containing a type name
1534099cc6bSBarry Smith 
1544099cc6bSBarry Smith    Output Parameter:
1554099cc6bSBarry Smith .  same - PETSC_TRUE if it is of the same base type
1564099cc6bSBarry Smith 
1574099cc6bSBarry Smith    Level: intermediate
1584099cc6bSBarry Smith 
1594099cc6bSBarry Smith .seealso: PetscObjectTypeCompare()
1604099cc6bSBarry Smith 
1614099cc6bSBarry Smith 
1624099cc6bSBarry Smith @*/
1634099cc6bSBarry Smith PetscErrorCode  PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
1644099cc6bSBarry Smith {
1654099cc6bSBarry Smith   PetscErrorCode ierr;
1664099cc6bSBarry Smith 
1674099cc6bSBarry Smith   PetscFunctionBegin;
1684099cc6bSBarry Smith   if (!obj) *same = PETSC_FALSE;
1694099cc6bSBarry Smith   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
1704099cc6bSBarry Smith   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
1714099cc6bSBarry Smith   else {
1724099cc6bSBarry Smith     PetscValidHeader(obj,1);
1734099cc6bSBarry Smith     PetscValidCharPointer(type_name,2);
1744099cc6bSBarry Smith     PetscValidPointer(same,3);
1754099cc6bSBarry Smith     ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
1764099cc6bSBarry Smith   }
1774099cc6bSBarry Smith   PetscFunctionReturn(0);
1784099cc6bSBarry Smith }
1794099cc6bSBarry Smith 
1804099cc6bSBarry Smith /*@C
181251f4c67SDmitry Karpeev    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
1822b12f010SJed Brown 
1832b12f010SJed Brown    Not Collective
1842b12f010SJed Brown 
1852b12f010SJed Brown    Input Parameters:
1862b12f010SJed Brown +  obj - any PETSc object, for example a Vec, Mat or KSP.
187251f4c67SDmitry Karpeev          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
1882b12f010SJed Brown -  type_name - string containing a type name, pass the empty string "" to terminate the list
1892b12f010SJed Brown 
1902b12f010SJed Brown    Output Parameter:
1912b12f010SJed Brown .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
1922b12f010SJed Brown 
1932b12f010SJed Brown    Level: intermediate
1942b12f010SJed Brown 
195251f4c67SDmitry Karpeev .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare()
1962b12f010SJed Brown 
1972b12f010SJed Brown    Concepts: comparing^object types
1982b12f010SJed Brown    Concepts: types^comparing
1992b12f010SJed Brown    Concepts: object type^comparing
2002b12f010SJed Brown 
2012b12f010SJed Brown @*/
202251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
2032b12f010SJed Brown {
2042b12f010SJed Brown   PetscErrorCode ierr;
2052b12f010SJed Brown   va_list        Argp;
2062b12f010SJed Brown 
2072b12f010SJed Brown   PetscFunctionBegin;
2082b12f010SJed Brown   *match = PETSC_FALSE;
2092b12f010SJed Brown   va_start(Argp,type_name);
2102b12f010SJed Brown   while (type_name && type_name[0]) {
2112b12f010SJed Brown     PetscBool found;
212251f4c67SDmitry Karpeev     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
2132b12f010SJed Brown     if (found) {
2142b12f010SJed Brown       *match = PETSC_TRUE;
2152b12f010SJed Brown       break;
2162b12f010SJed Brown     }
2172b12f010SJed Brown     type_name = va_arg(Argp,const char*);
2182b12f010SJed Brown   }
2192b12f010SJed Brown   va_end(Argp);
2202b12f010SJed Brown   PetscFunctionReturn(0);
2212b12f010SJed Brown }
2222b12f010SJed Brown 
2233cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
224e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2253cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
226e5c89e4eSSatish Balay 
227e5c89e4eSSatish Balay /*@C
228e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
229e5c89e4eSSatish Balay      PetscFinalize() is called.
230e5c89e4eSSatish Balay 
2313f9fe445SBarry Smith    Logically Collective on PetscObject
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay    Input Parameter:
234e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
235e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
236e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
237e5c89e4eSSatish Balay 
238e5c89e4eSSatish Balay    Level: developer
239e5c89e4eSSatish Balay 
240e5c89e4eSSatish Balay    Notes:
241e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
242e5c89e4eSSatish Balay     when PETSc ends.
243e5c89e4eSSatish Balay 
244e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
245e5c89e4eSSatish Balay @*/
2467087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
247e5c89e4eSSatish Balay {
248e5c89e4eSSatish Balay   PetscFunctionBegin;
249e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
250a825bcd5SBarry Smith   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
251a297a907SKarl Rupp   else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGDESOBJS\n",MAXREGDESOBJS);
252e5c89e4eSSatish Balay   PetscFunctionReturn(0);
253e5c89e4eSSatish Balay }
254e5c89e4eSSatish Balay 
255e5c89e4eSSatish Balay /*@C
256e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
257e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
258e5c89e4eSSatish Balay 
2593f9fe445SBarry Smith    Logically Collective on individual PetscObjects
260e5c89e4eSSatish Balay 
261e5c89e4eSSatish Balay    Level: developer
262e5c89e4eSSatish Balay 
263e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
264e5c89e4eSSatish Balay @*/
2657087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroyAll(void)
266e5c89e4eSSatish Balay {
267e5c89e4eSSatish Balay   PetscErrorCode ierr;
2688c74ee41SBarry Smith   PetscInt       i;
269e5c89e4eSSatish Balay 
270e5c89e4eSSatish Balay   PetscFunctionBegin;
271e5c89e4eSSatish Balay   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
272fcfd50ebSBarry Smith     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
273e5c89e4eSSatish Balay   }
2743cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
275e5c89e4eSSatish Balay   PetscFunctionReturn(0);
276e5c89e4eSSatish Balay }
277e5c89e4eSSatish Balay 
278e5c89e4eSSatish Balay 
279eb8be38cSBarry Smith #define MAXREGFIN 256
280eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0;
281*00a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
282eb8be38cSBarry Smith 
283eb8be38cSBarry Smith /*@C
284eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
285eb8be38cSBarry Smith 
286eb8be38cSBarry Smith    Not Collective
287eb8be38cSBarry Smith 
288eb8be38cSBarry Smith    Input Parameter:
289eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
290eb8be38cSBarry Smith 
291eb8be38cSBarry Smith    Level: developer
292eb8be38cSBarry Smith 
293eb8be38cSBarry Smith    Notes:
2942390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
295eb8be38cSBarry Smith 
296eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll()
297eb8be38cSBarry Smith @*/
2987087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
299eb8be38cSBarry Smith {
300f4aac215SBarry Smith   PetscInt i;
301eb8be38cSBarry Smith 
302f4aac215SBarry Smith   PetscFunctionBegin;
303f4aac215SBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
304aee23540SBarry Smith     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
305f4aac215SBarry Smith   }
306a297a907SKarl Rupp   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
307a297a907SKarl Rupp   else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGFIN\n",MAXREGFIN);
308eb8be38cSBarry Smith   PetscFunctionReturn(0);
309eb8be38cSBarry Smith }
310eb8be38cSBarry Smith 
311eb8be38cSBarry Smith /*@C
312eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
313eb8be38cSBarry Smith 
314eb8be38cSBarry Smith    Not Collective unless registered functions are collective
315eb8be38cSBarry Smith 
316eb8be38cSBarry Smith    Level: developer
317eb8be38cSBarry Smith 
318eb8be38cSBarry Smith .seealso: PetscRegisterFinalize()
319eb8be38cSBarry Smith @*/
3207087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalizeAll(void)
321eb8be38cSBarry Smith {
322eb8be38cSBarry Smith   PetscErrorCode ierr;
3238c74ee41SBarry Smith   PetscInt       i;
324eb8be38cSBarry Smith 
325eb8be38cSBarry Smith   PetscFunctionBegin;
326eb8be38cSBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
327eb8be38cSBarry Smith     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
328eb8be38cSBarry Smith   }
329eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
330eb8be38cSBarry Smith   PetscFunctionReturn(0);
331eb8be38cSBarry Smith }
332