xref: /petsc/src/sys/objects/destroy.c (revision 2b12f01083a96923cba0dc655bd23446079c9dee)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5c6db04a5SJed Brown #include <petscsys.h>  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay 
8d42688cbSBarry Smith #undef __FUNCT__
9d42688cbSBarry Smith #define __FUNCT__ "PetscComposedQuantitiesDestroy"
10b436f76fSVictor Eijkhout PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
11b436f76fSVictor Eijkhout {
12d42688cbSBarry Smith   PetscErrorCode ierr;
13d42688cbSBarry Smith   PetscInt       i;
14d42688cbSBarry Smith 
15b436f76fSVictor Eijkhout   PetscFunctionBegin;
16b436f76fSVictor Eijkhout   if (obj->intstar_idmax>0) {
17b436f76fSVictor Eijkhout     for (i=0; i<obj->intstar_idmax; i++) {
18b436f76fSVictor Eijkhout       ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr);
19b436f76fSVictor Eijkhout     }
20b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr);
21b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr);
22b436f76fSVictor Eijkhout   }
23b436f76fSVictor Eijkhout   if (obj->realstar_idmax>0) {
24b436f76fSVictor Eijkhout     for (i=0; i<obj->realstar_idmax; i++) {
25b436f76fSVictor Eijkhout       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
26b436f76fSVictor Eijkhout     }
27b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr);
28b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr);
29b436f76fSVictor Eijkhout   }
30b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax>0) {
31b436f76fSVictor Eijkhout     for (i=0; i<obj->scalarstar_idmax; i++) {
32b436f76fSVictor Eijkhout       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
33b436f76fSVictor Eijkhout     }
34b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr);
35b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr);
36b436f76fSVictor Eijkhout   }
37d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr);
38d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr);
39d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr);
40d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr);
41d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr);
42d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr);
43b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
44b436f76fSVictor Eijkhout }
45b436f76fSVictor Eijkhout 
46e5c89e4eSSatish Balay #undef __FUNCT__
47e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDestroy"
48e30d2299SSatish Balay /*@
49e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
50e5c89e4eSSatish Balay 
51e5c89e4eSSatish Balay    Collective on PetscObject
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay    Input Parameter:
54e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
55fcfd50ebSBarry Smith          This must be cast with a (PetscObject*), for example,
56fcfd50ebSBarry Smith          PetscObjectDestroy((PetscObject*)&mat);
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay    Level: beginner
59e5c89e4eSSatish Balay 
60e5c89e4eSSatish Balay     Concepts: destroying object
61e5c89e4eSSatish Balay     Concepts: freeing object
62e5c89e4eSSatish Balay     Concepts: deleting object
63e5c89e4eSSatish Balay 
64e5c89e4eSSatish Balay @*/
65fcfd50ebSBarry Smith PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
66e5c89e4eSSatish Balay {
67e5c89e4eSSatish Balay   PetscErrorCode ierr;
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay   PetscFunctionBegin;
706bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
716bf464f9SBarry Smith   PetscValidHeader(*obj,1);
72fcfd50ebSBarry Smith   if (*obj && (*obj)->bops->destroy) {
73fcfd50ebSBarry Smith     ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr);
746bf464f9SBarry 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);
75e5c89e4eSSatish Balay   PetscFunctionReturn(0);
76e5c89e4eSSatish Balay }
77e5c89e4eSSatish Balay 
78e5c89e4eSSatish Balay #undef __FUNCT__
79e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectView"
80e5c89e4eSSatish Balay /*@C
81e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
82e5c89e4eSSatish Balay 
83e5c89e4eSSatish Balay    Collective on PetscObject
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay    Input Parameters:
86e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
87e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
88e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
89e5c89e4eSSatish Balay -  viewer - any PETSc viewer
90e5c89e4eSSatish Balay 
91e5c89e4eSSatish Balay    Level: intermediate
92e5c89e4eSSatish Balay 
93e5c89e4eSSatish Balay @*/
947087cfbeSBarry Smith PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
95e5c89e4eSSatish Balay {
96e5c89e4eSSatish Balay   PetscErrorCode ierr;
97e5c89e4eSSatish Balay 
98e5c89e4eSSatish Balay   PetscFunctionBegin;
99e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
1003050cee2SBarry Smith   if (!viewer) {
1013050cee2SBarry Smith     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
1023050cee2SBarry Smith   }
1030700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay   if (obj->bops->view) {
106e5c89e4eSSatish Balay     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
107e5c89e4eSSatish Balay   } else {
108e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
109e5c89e4eSSatish Balay   }
110e5c89e4eSSatish Balay   PetscFunctionReturn(0);
111e5c89e4eSSatish Balay }
112e5c89e4eSSatish Balay 
113e5c89e4eSSatish Balay #undef __FUNCT__
114e5c89e4eSSatish Balay #define __FUNCT__ "PetscTypeCompare"
115e5c89e4eSSatish Balay /*@C
116e5c89e4eSSatish Balay    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay    Not Collective
119e5c89e4eSSatish Balay 
120e5c89e4eSSatish Balay    Input Parameters:
121e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
122e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
123fcfd50ebSBarry Smith          PetscTypeCompare((PetscObject)mat);
124e5c89e4eSSatish Balay -  type_name - string containing a type name
125e5c89e4eSSatish Balay 
126e5c89e4eSSatish Balay    Output Parameter:
127e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
128e5c89e4eSSatish Balay 
129e5c89e4eSSatish Balay    Level: intermediate
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay    Concepts: comparing^object types
134e5c89e4eSSatish Balay    Concepts: types^comparing
135e5c89e4eSSatish Balay    Concepts: object type^comparing
136e5c89e4eSSatish Balay 
137e5c89e4eSSatish Balay @*/
1387087cfbeSBarry Smith PetscErrorCode  PetscTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
139e5c89e4eSSatish Balay {
140e5c89e4eSSatish Balay   PetscErrorCode ierr;
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay   PetscFunctionBegin;
143e5c89e4eSSatish Balay   if (!obj) {
144e5c89e4eSSatish Balay     *same = PETSC_FALSE;
145e5c89e4eSSatish Balay   } else if (!type_name && !obj->type_name) {
146e5c89e4eSSatish Balay     *same = PETSC_TRUE;
147e5c89e4eSSatish Balay   } else if (!type_name || !obj->type_name) {
148e5c89e4eSSatish Balay     *same = PETSC_FALSE;
149e5c89e4eSSatish Balay   } else {
150e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
151e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
152e5c89e4eSSatish Balay     PetscValidPointer(same,3);
153e5c89e4eSSatish Balay     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
154e5c89e4eSSatish Balay   }
155e5c89e4eSSatish Balay   PetscFunctionReturn(0);
156e5c89e4eSSatish Balay }
157e5c89e4eSSatish Balay 
158*2b12f010SJed Brown #undef __FUNCT__
159*2b12f010SJed Brown #define __FUNCT__ "PetscTypeCompareAny"
160*2b12f010SJed Brown /*@C
161*2b12f010SJed Brown    PetscTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
162*2b12f010SJed Brown 
163*2b12f010SJed Brown    Not Collective
164*2b12f010SJed Brown 
165*2b12f010SJed Brown    Input Parameters:
166*2b12f010SJed Brown +  obj - any PETSc object, for example a Vec, Mat or KSP.
167*2b12f010SJed Brown          This must be cast with a (PetscObject), for example, PetscTypeCompareAny((PetscObject)mat,...);
168*2b12f010SJed Brown -  type_name - string containing a type name, pass the empty string "" to terminate the list
169*2b12f010SJed Brown 
170*2b12f010SJed Brown    Output Parameter:
171*2b12f010SJed Brown .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
172*2b12f010SJed Brown 
173*2b12f010SJed Brown    Level: intermediate
174*2b12f010SJed Brown 
175*2b12f010SJed Brown .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscTypeCompare()
176*2b12f010SJed Brown 
177*2b12f010SJed Brown    Concepts: comparing^object types
178*2b12f010SJed Brown    Concepts: types^comparing
179*2b12f010SJed Brown    Concepts: object type^comparing
180*2b12f010SJed Brown 
181*2b12f010SJed Brown @*/
182*2b12f010SJed Brown PetscErrorCode PetscTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
183*2b12f010SJed Brown {
184*2b12f010SJed Brown   PetscErrorCode ierr;
185*2b12f010SJed Brown   va_list Argp;
186*2b12f010SJed Brown 
187*2b12f010SJed Brown   PetscFunctionBegin;
188*2b12f010SJed Brown   *match = PETSC_FALSE;
189*2b12f010SJed Brown   va_start(Argp,type_name);
190*2b12f010SJed Brown   while (type_name && type_name[0]) {
191*2b12f010SJed Brown     PetscBool found;
192*2b12f010SJed Brown     ierr = PetscTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
193*2b12f010SJed Brown     if (found) {
194*2b12f010SJed Brown       *match = PETSC_TRUE;
195*2b12f010SJed Brown       break;
196*2b12f010SJed Brown     }
197*2b12f010SJed Brown     type_name = va_arg(Argp,const char*);
198*2b12f010SJed Brown   }
199*2b12f010SJed Brown   va_end(Argp);
200*2b12f010SJed Brown   PetscFunctionReturn(0);
201*2b12f010SJed Brown }
202*2b12f010SJed Brown 
2033cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
204e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2053cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
206e5c89e4eSSatish Balay 
207e5c89e4eSSatish Balay #undef __FUNCT__
208e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroy"
209e5c89e4eSSatish Balay /*@C
210e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
211e5c89e4eSSatish Balay      PetscFinalize() is called.
212e5c89e4eSSatish Balay 
2133f9fe445SBarry Smith    Logically Collective on PetscObject
214e5c89e4eSSatish Balay 
215e5c89e4eSSatish Balay    Input Parameter:
216e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
217e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
218e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay    Level: developer
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Notes:
223e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
224e5c89e4eSSatish Balay     when PETSc ends.
225e5c89e4eSSatish Balay 
226e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
227e5c89e4eSSatish Balay @*/
2287087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
229e5c89e4eSSatish Balay {
230e5c89e4eSSatish Balay   PetscFunctionBegin;
231e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
2323cfa8680SLisandro Dalcin   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) {
233e5c89e4eSSatish Balay     PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
2343cfa8680SLisandro Dalcin   } else {
235e32f2f54SBarry Smith     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);
2363cfa8680SLisandro Dalcin 
2373cfa8680SLisandro Dalcin   }
238e5c89e4eSSatish Balay   PetscFunctionReturn(0);
239e5c89e4eSSatish Balay }
240e5c89e4eSSatish Balay 
241e5c89e4eSSatish Balay #undef __FUNCT__
242e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroyAll"
243e5c89e4eSSatish Balay /*@C
244e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
245e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
246e5c89e4eSSatish Balay 
2473f9fe445SBarry Smith    Logically Collective on individual PetscObjects
248e5c89e4eSSatish Balay 
249e5c89e4eSSatish Balay    Level: developer
250e5c89e4eSSatish Balay 
251e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
252e5c89e4eSSatish Balay @*/
2537087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroyAll(void)
254e5c89e4eSSatish Balay {
255e5c89e4eSSatish Balay   PetscErrorCode ierr;
256e5c89e4eSSatish Balay   int i;
257e5c89e4eSSatish Balay 
258e5c89e4eSSatish Balay   PetscFunctionBegin;
259e5c89e4eSSatish Balay   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
260fcfd50ebSBarry Smith     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
261e5c89e4eSSatish Balay   }
2623cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
263e5c89e4eSSatish Balay   PetscFunctionReturn(0);
264e5c89e4eSSatish Balay }
265e5c89e4eSSatish Balay 
266e5c89e4eSSatish Balay 
267eb8be38cSBarry Smith #define MAXREGFIN 256
268eb8be38cSBarry Smith static int         PetscRegisterFinalize_Count = 0;
269eb8be38cSBarry Smith static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
270eb8be38cSBarry Smith 
271eb8be38cSBarry Smith #undef __FUNCT__
272eb8be38cSBarry Smith #define __FUNCT__ "PetscRegisterFinalize"
273eb8be38cSBarry Smith /*@C
274eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
275eb8be38cSBarry Smith 
276eb8be38cSBarry Smith    Not Collective
277eb8be38cSBarry Smith 
278eb8be38cSBarry Smith    Input Parameter:
279eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
280eb8be38cSBarry Smith 
281eb8be38cSBarry Smith    Level: developer
282eb8be38cSBarry Smith 
283eb8be38cSBarry Smith    Notes:
2842390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
285eb8be38cSBarry Smith 
286eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll()
287eb8be38cSBarry Smith @*/
2887087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
289eb8be38cSBarry Smith {
290eb8be38cSBarry Smith   PetscFunctionBegin;
291eb8be38cSBarry Smith 
292eb8be38cSBarry Smith   if (PetscRegisterFinalize_Count < MAXREGFIN) {
293eb8be38cSBarry Smith     PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
294eb8be38cSBarry Smith   } else {
295e32f2f54SBarry Smith     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);
296eb8be38cSBarry Smith 
297eb8be38cSBarry Smith   }
298eb8be38cSBarry Smith   PetscFunctionReturn(0);
299eb8be38cSBarry Smith }
300eb8be38cSBarry Smith 
301eb8be38cSBarry Smith #undef __FUNCT__
30253c77d0aSJed Brown #define __FUNCT__ "PetscRegisterFinalizeAll"
303eb8be38cSBarry Smith /*@C
304eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
305eb8be38cSBarry Smith 
306eb8be38cSBarry Smith    Not Collective unless registered functions are collective
307eb8be38cSBarry Smith 
308eb8be38cSBarry Smith    Level: developer
309eb8be38cSBarry Smith 
310eb8be38cSBarry Smith .seealso: PetscRegisterFinalize()
311eb8be38cSBarry Smith @*/
3127087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalizeAll(void)
313eb8be38cSBarry Smith {
314eb8be38cSBarry Smith   PetscErrorCode ierr;
315eb8be38cSBarry Smith   int i;
316eb8be38cSBarry Smith 
317eb8be38cSBarry Smith   PetscFunctionBegin;
318eb8be38cSBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
319eb8be38cSBarry Smith     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
320eb8be38cSBarry Smith   }
321eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
322eb8be38cSBarry Smith   PetscFunctionReturn(0);
323eb8be38cSBarry Smith }
324