xref: /petsc/src/sys/objects/destroy.c (revision 76478e187bf7839d0887c873e9cbbfdc3b08726b)
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     }
18071fcb05SBarry Smith     ierr = PetscFree2(obj->intstarcomposeddata,obj->intstarcomposedstate);CHKERRQ(ierr);
19b436f76fSVictor Eijkhout   }
20b436f76fSVictor Eijkhout   if (obj->realstar_idmax>0) {
21b436f76fSVictor Eijkhout     for (i=0; i<obj->realstar_idmax; i++) {
22b436f76fSVictor Eijkhout       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
23b436f76fSVictor Eijkhout     }
24071fcb05SBarry Smith     ierr = PetscFree2(obj->realstarcomposeddata,obj->realstarcomposedstate);CHKERRQ(ierr);
25b436f76fSVictor Eijkhout   }
26b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax>0) {
27b436f76fSVictor Eijkhout     for (i=0; i<obj->scalarstar_idmax; i++) {
28b436f76fSVictor Eijkhout       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
29b436f76fSVictor Eijkhout     }
30071fcb05SBarry Smith     ierr = PetscFree2(obj->scalarstarcomposeddata,obj->scalarstarcomposedstate);CHKERRQ(ierr);
31b436f76fSVictor Eijkhout   }
32071fcb05SBarry Smith   ierr = PetscFree2(obj->intcomposeddata,obj->intcomposedstate);CHKERRQ(ierr);
33071fcb05SBarry Smith   ierr = PetscFree2(obj->realcomposeddata,obj->realcomposedstate);CHKERRQ(ierr);
34071fcb05SBarry Smith   ierr = PetscFree2(obj->scalarcomposeddata,obj->scalarcomposedstate);CHKERRQ(ierr);
35b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
36b436f76fSVictor Eijkhout }
37b436f76fSVictor Eijkhout 
38e30d2299SSatish Balay /*@
39e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
40e5c89e4eSSatish Balay 
41e5c89e4eSSatish Balay    Collective on PetscObject
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay    Input Parameter:
44e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
45fcfd50ebSBarry Smith          This must be cast with a (PetscObject*), for example,
46fcfd50ebSBarry Smith          PetscObjectDestroy((PetscObject*)&mat);
47e5c89e4eSSatish Balay 
48e5c89e4eSSatish Balay    Level: beginner
49e5c89e4eSSatish Balay 
50e5c89e4eSSatish Balay @*/
51fcfd50ebSBarry Smith PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
52e5c89e4eSSatish Balay {
53e5c89e4eSSatish Balay   PetscErrorCode ierr;
54e5c89e4eSSatish Balay 
55e5c89e4eSSatish Balay   PetscFunctionBegin;
566bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
576bf464f9SBarry Smith   PetscValidHeader(*obj,1);
58fcfd50ebSBarry Smith   if (*obj && (*obj)->bops->destroy) {
59fcfd50ebSBarry Smith     ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr);
606bf464f9SBarry 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);
61e5c89e4eSSatish Balay   PetscFunctionReturn(0);
62e5c89e4eSSatish Balay }
63e5c89e4eSSatish Balay 
64e5c89e4eSSatish Balay /*@C
65e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay    Collective on PetscObject
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay    Input Parameters:
70e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
71e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
72e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
73e5c89e4eSSatish Balay -  viewer - any PETSc viewer
74e5c89e4eSSatish Balay 
75e5c89e4eSSatish Balay    Level: intermediate
76e5c89e4eSSatish Balay 
77e5c89e4eSSatish Balay @*/
787087cfbeSBarry Smith PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
79e5c89e4eSSatish Balay {
80e5c89e4eSSatish Balay   PetscErrorCode ierr;
81e5c89e4eSSatish Balay 
82e5c89e4eSSatish Balay   PetscFunctionBegin;
83e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
843050cee2SBarry Smith   if (!viewer) {
853050cee2SBarry Smith     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
863050cee2SBarry Smith   }
870700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
88e5c89e4eSSatish Balay 
89e5c89e4eSSatish Balay   if (obj->bops->view) {
90e5c89e4eSSatish Balay     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
91f23aa3ddSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
92e5c89e4eSSatish Balay   PetscFunctionReturn(0);
93e5c89e4eSSatish Balay }
94e5c89e4eSSatish Balay 
952d747510SLisandro Dalcin #define CHKERRQI(incall,ierr) if (ierr) {incall = PETSC_FALSE; CHKERRQ(ierr);}
962d747510SLisandro Dalcin 
972d747510SLisandro Dalcin /*@C
982d747510SLisandro Dalcin   PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed.
992d747510SLisandro Dalcin 
1002d747510SLisandro Dalcin   Collective on PetscObject
1012d747510SLisandro Dalcin 
1022d747510SLisandro Dalcin   Input Parameters:
1032d747510SLisandro Dalcin + obj   - the object
1042d747510SLisandro Dalcin . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
1052d747510SLisandro Dalcin - optionname - option to activate viewing
1062d747510SLisandro Dalcin 
1072d747510SLisandro Dalcin   Level: intermediate
1082d747510SLisandro Dalcin 
1092d747510SLisandro Dalcin @*/
1102d747510SLisandro Dalcin PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[])
1112d747510SLisandro Dalcin {
1122d747510SLisandro Dalcin   PetscErrorCode    ierr;
1132d747510SLisandro Dalcin   PetscViewer       viewer;
1142d747510SLisandro Dalcin   PetscBool         flg;
1152d747510SLisandro Dalcin   static PetscBool  incall = PETSC_FALSE;
1162d747510SLisandro Dalcin   PetscViewerFormat format;
1172d747510SLisandro Dalcin   const char        *prefix;
1182d747510SLisandro Dalcin 
1192d747510SLisandro Dalcin   PetscFunctionBegin;
1202d747510SLisandro Dalcin   if (incall) PetscFunctionReturn(0);
1212d747510SLisandro Dalcin   incall = PETSC_TRUE;
1222d747510SLisandro Dalcin   prefix = bobj ? bobj->prefix : obj->prefix;
12316413a6aSBarry Smith   ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg);CHKERRQI(incall,ierr);
1242d747510SLisandro Dalcin   if (flg) {
1252d747510SLisandro Dalcin     ierr = PetscViewerPushFormat(viewer,format);CHKERRQI(incall,ierr);
1262d747510SLisandro Dalcin     ierr = PetscObjectView(obj,viewer);CHKERRQI(incall,ierr);
127*76478e18SToby Isaac     ierr = PetscViewerFlush(viewer);CHKERRQI(incall,ierr);
1282d747510SLisandro Dalcin     ierr = PetscViewerPopFormat(viewer);CHKERRQI(incall,ierr);
1292d747510SLisandro Dalcin     ierr = PetscViewerDestroy(&viewer);CHKERRQI(incall,ierr);
1302d747510SLisandro Dalcin   }
1312d747510SLisandro Dalcin   incall = PETSC_FALSE;
1322d747510SLisandro Dalcin   PetscFunctionReturn(0);
1332d747510SLisandro Dalcin }
1342d747510SLisandro Dalcin 
135e5c89e4eSSatish Balay /*@C
136251f4c67SDmitry Karpeev    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay    Not Collective
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay    Input Parameters:
141e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
142e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
143251f4c67SDmitry Karpeev          PetscObjectTypeCompare((PetscObject)mat);
144e5c89e4eSSatish Balay -  type_name - string containing a type name
145e5c89e4eSSatish Balay 
146e5c89e4eSSatish Balay    Output Parameter:
147e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
148e5c89e4eSSatish Balay 
149e5c89e4eSSatish Balay    Level: intermediate
150e5c89e4eSSatish Balay 
151b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny()
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay @*/
154251f4c67SDmitry Karpeev PetscErrorCode  PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
155e5c89e4eSSatish Balay {
156e5c89e4eSSatish Balay   PetscErrorCode ierr;
157e5c89e4eSSatish Balay 
158e5c89e4eSSatish Balay   PetscFunctionBegin;
15956499564SJose E. Roman   PetscValidPointer(same,3);
160a297a907SKarl Rupp   if (!obj) *same = PETSC_FALSE;
161a297a907SKarl Rupp   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
162a297a907SKarl Rupp   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
163a297a907SKarl Rupp   else {
164e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
165e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
166e5c89e4eSSatish Balay     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
167e5c89e4eSSatish Balay   }
168e5c89e4eSSatish Balay   PetscFunctionReturn(0);
169e5c89e4eSSatish Balay }
170e5c89e4eSSatish Balay 
1712b12f010SJed Brown /*@C
1724099cc6bSBarry Smith    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
1734099cc6bSBarry Smith 
1744099cc6bSBarry Smith    Not Collective
1754099cc6bSBarry Smith 
1764099cc6bSBarry Smith    Input Parameters:
1774099cc6bSBarry Smith +  mat - the matrix
1784099cc6bSBarry Smith -  type_name - string containing a type name
1794099cc6bSBarry Smith 
1804099cc6bSBarry Smith    Output Parameter:
1814099cc6bSBarry Smith .  same - PETSC_TRUE if it is of the same base type
1824099cc6bSBarry Smith 
1834099cc6bSBarry Smith    Level: intermediate
1844099cc6bSBarry Smith 
185b9e7e5c1SBarry Smith .seealso: PetscObjectTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny()
1864099cc6bSBarry Smith 
1874099cc6bSBarry Smith @*/
1884099cc6bSBarry Smith PetscErrorCode  PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
1894099cc6bSBarry Smith {
1904099cc6bSBarry Smith   PetscErrorCode ierr;
1914099cc6bSBarry Smith 
1924099cc6bSBarry Smith   PetscFunctionBegin;
19356499564SJose E. Roman   PetscValidPointer(same,3);
1944099cc6bSBarry Smith   if (!obj) *same = PETSC_FALSE;
1954099cc6bSBarry Smith   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
1964099cc6bSBarry Smith   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
1974099cc6bSBarry Smith   else {
1984099cc6bSBarry Smith     PetscValidHeader(obj,1);
1994099cc6bSBarry Smith     PetscValidCharPointer(type_name,2);
2004099cc6bSBarry Smith     ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
2014099cc6bSBarry Smith   }
2024099cc6bSBarry Smith   PetscFunctionReturn(0);
2034099cc6bSBarry Smith }
2044099cc6bSBarry Smith 
2054099cc6bSBarry Smith /*@C
206251f4c67SDmitry Karpeev    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
2072b12f010SJed Brown 
2082b12f010SJed Brown    Not Collective
2092b12f010SJed Brown 
2102b12f010SJed Brown    Input Parameters:
2112b12f010SJed Brown +  obj - any PETSc object, for example a Vec, Mat or KSP.
212251f4c67SDmitry Karpeev          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
2132b12f010SJed Brown -  type_name - string containing a type name, pass the empty string "" to terminate the list
2142b12f010SJed Brown 
2152b12f010SJed Brown    Output Parameter:
2162b12f010SJed Brown .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
2172b12f010SJed Brown 
2182b12f010SJed Brown    Level: intermediate
2192b12f010SJed Brown 
220b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
2212b12f010SJed Brown 
2222b12f010SJed Brown @*/
223251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
2242b12f010SJed Brown {
2252b12f010SJed Brown   PetscErrorCode ierr;
2262b12f010SJed Brown   va_list        Argp;
2272b12f010SJed Brown 
2282b12f010SJed Brown   PetscFunctionBegin;
22956499564SJose E. Roman   PetscValidPointer(match,3);
2302b12f010SJed Brown   *match = PETSC_FALSE;
2312b12f010SJed Brown   va_start(Argp,type_name);
2322b12f010SJed Brown   while (type_name && type_name[0]) {
2332b12f010SJed Brown     PetscBool found;
234251f4c67SDmitry Karpeev     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
2352b12f010SJed Brown     if (found) {
2362b12f010SJed Brown       *match = PETSC_TRUE;
2372b12f010SJed Brown       break;
2382b12f010SJed Brown     }
2392b12f010SJed Brown     type_name = va_arg(Argp,const char*);
2402b12f010SJed Brown   }
2412b12f010SJed Brown   va_end(Argp);
2422b12f010SJed Brown   PetscFunctionReturn(0);
2432b12f010SJed Brown }
2442b12f010SJed Brown 
245b9e7e5c1SBarry Smith 
246b9e7e5c1SBarry Smith /*@C
247b9e7e5c1SBarry Smith    PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types.
248b9e7e5c1SBarry Smith 
249b9e7e5c1SBarry Smith    Not Collective
250b9e7e5c1SBarry Smith 
251b9e7e5c1SBarry Smith    Input Parameters:
252b9e7e5c1SBarry Smith +  obj - any PETSc object, for example a Vec, Mat or KSP.
253b9e7e5c1SBarry Smith          This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...);
254b9e7e5c1SBarry Smith -  type_name - string containing a type name, pass the empty string "" to terminate the list
255b9e7e5c1SBarry Smith 
256b9e7e5c1SBarry Smith    Output Parameter:
257b9e7e5c1SBarry Smith .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
258b9e7e5c1SBarry Smith 
259b9e7e5c1SBarry Smith    Level: intermediate
260b9e7e5c1SBarry Smith 
261b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
262b9e7e5c1SBarry Smith 
263b9e7e5c1SBarry Smith @*/
264b9e7e5c1SBarry Smith PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
265b9e7e5c1SBarry Smith {
266b9e7e5c1SBarry Smith   PetscErrorCode ierr;
267b9e7e5c1SBarry Smith   va_list        Argp;
268b9e7e5c1SBarry Smith 
269b9e7e5c1SBarry Smith   PetscFunctionBegin;
270b9e7e5c1SBarry Smith   PetscValidPointer(match,3);
271b9e7e5c1SBarry Smith   *match = PETSC_FALSE;
272b9e7e5c1SBarry Smith   va_start(Argp,type_name);
273b9e7e5c1SBarry Smith   while (type_name && type_name[0]) {
274b9e7e5c1SBarry Smith     PetscBool found;
275b9e7e5c1SBarry Smith     ierr = PetscObjectBaseTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
276b9e7e5c1SBarry Smith     if (found) {
277b9e7e5c1SBarry Smith       *match = PETSC_TRUE;
278b9e7e5c1SBarry Smith       break;
279b9e7e5c1SBarry Smith     }
280b9e7e5c1SBarry Smith     type_name = va_arg(Argp,const char*);
281b9e7e5c1SBarry Smith   }
282b9e7e5c1SBarry Smith   va_end(Argp);
283b9e7e5c1SBarry Smith   PetscFunctionReturn(0);
284b9e7e5c1SBarry Smith }
285b9e7e5c1SBarry Smith 
2863cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
287e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2883cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
289e5c89e4eSSatish Balay 
290e5c89e4eSSatish Balay /*@C
291e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
292e5c89e4eSSatish Balay      PetscFinalize() is called.
293e5c89e4eSSatish Balay 
2943f9fe445SBarry Smith    Logically Collective on PetscObject
295e5c89e4eSSatish Balay 
296e5c89e4eSSatish Balay    Input Parameter:
297e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
298e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
299e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
300e5c89e4eSSatish Balay 
301e5c89e4eSSatish Balay    Level: developer
302e5c89e4eSSatish Balay 
303e5c89e4eSSatish Balay    Notes:
304e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
305e5c89e4eSSatish Balay     when PETSc ends.
306e5c89e4eSSatish Balay 
307e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
308e5c89e4eSSatish Balay @*/
3097087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
310e5c89e4eSSatish Balay {
311e5c89e4eSSatish Balay   PetscFunctionBegin;
312e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
313a825bcd5SBarry Smith   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
314a297a907SKarl 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);
315e5c89e4eSSatish Balay   PetscFunctionReturn(0);
316e5c89e4eSSatish Balay }
317e5c89e4eSSatish Balay 
318e5c89e4eSSatish Balay /*@C
319e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
320e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
321e5c89e4eSSatish Balay 
3223f9fe445SBarry Smith    Logically Collective on individual PetscObjects
323e5c89e4eSSatish Balay 
324e5c89e4eSSatish Balay    Level: developer
325e5c89e4eSSatish Balay 
326e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
327e5c89e4eSSatish Balay @*/
3287087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroyAll(void)
329e5c89e4eSSatish Balay {
330e5c89e4eSSatish Balay   PetscErrorCode ierr;
3318c74ee41SBarry Smith   PetscInt       i;
332e5c89e4eSSatish Balay 
333e5c89e4eSSatish Balay   PetscFunctionBegin;
334e5c89e4eSSatish Balay   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
335fcfd50ebSBarry Smith     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
336e5c89e4eSSatish Balay   }
3373cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
338e5c89e4eSSatish Balay   PetscFunctionReturn(0);
339e5c89e4eSSatish Balay }
340e5c89e4eSSatish Balay 
341e5c89e4eSSatish Balay 
342eb8be38cSBarry Smith #define MAXREGFIN 256
343eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0;
34400a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
345eb8be38cSBarry Smith 
346eb8be38cSBarry Smith /*@C
347eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
348eb8be38cSBarry Smith 
349eb8be38cSBarry Smith    Not Collective
350eb8be38cSBarry Smith 
351eb8be38cSBarry Smith    Input Parameter:
352eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
353eb8be38cSBarry Smith 
354eb8be38cSBarry Smith    Level: developer
355eb8be38cSBarry Smith 
356eb8be38cSBarry Smith    Notes:
3572390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
358eb8be38cSBarry Smith 
359eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll()
360eb8be38cSBarry Smith @*/
3617087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
362eb8be38cSBarry Smith {
363f4aac215SBarry Smith   PetscInt i;
364eb8be38cSBarry Smith 
365f4aac215SBarry Smith   PetscFunctionBegin;
366f4aac215SBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
367aee23540SBarry Smith     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
368f4aac215SBarry Smith   }
369a297a907SKarl Rupp   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
370a297a907SKarl 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);
371eb8be38cSBarry Smith   PetscFunctionReturn(0);
372eb8be38cSBarry Smith }
373eb8be38cSBarry Smith 
374eb8be38cSBarry Smith /*@C
375eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
376eb8be38cSBarry Smith 
377eb8be38cSBarry Smith    Not Collective unless registered functions are collective
378eb8be38cSBarry Smith 
379eb8be38cSBarry Smith    Level: developer
380eb8be38cSBarry Smith 
381eb8be38cSBarry Smith .seealso: PetscRegisterFinalize()
382eb8be38cSBarry Smith @*/
3837087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalizeAll(void)
384eb8be38cSBarry Smith {
385eb8be38cSBarry Smith   PetscErrorCode ierr;
3868c74ee41SBarry Smith   PetscInt       i;
387eb8be38cSBarry Smith 
388eb8be38cSBarry Smith   PetscFunctionBegin;
389eb8be38cSBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
390eb8be38cSBarry Smith     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
391eb8be38cSBarry Smith   }
392eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
393eb8be38cSBarry Smith   PetscFunctionReturn(0);
394eb8be38cSBarry Smith }
395