xref: /petsc/src/sys/objects/destroy.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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   PetscInt i;
11d42688cbSBarry Smith 
12b436f76fSVictor Eijkhout   PetscFunctionBegin;
13b436f76fSVictor Eijkhout   if (obj->intstar_idmax>0) {
14*5f80ce2aSJacob Faibussowitsch     for (i=0; i<obj->intstar_idmax; i++) CHKERRQ(PetscFree(obj->intstarcomposeddata[i]));
15*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(obj->intstarcomposeddata,obj->intstarcomposedstate));
16b436f76fSVictor Eijkhout   }
17b436f76fSVictor Eijkhout   if (obj->realstar_idmax>0) {
18*5f80ce2aSJacob Faibussowitsch     for (i=0; i<obj->realstar_idmax; i++) CHKERRQ(PetscFree(obj->realstarcomposeddata[i]));
19*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(obj->realstarcomposeddata,obj->realstarcomposedstate));
20b436f76fSVictor Eijkhout   }
21b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax>0) {
22*5f80ce2aSJacob Faibussowitsch     for (i=0; i<obj->scalarstar_idmax; i++) CHKERRQ(PetscFree(obj->scalarstarcomposeddata[i]));
23*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(obj->scalarstarcomposeddata,obj->scalarstarcomposedstate));
24b436f76fSVictor Eijkhout   }
25*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree2(obj->intcomposeddata,obj->intcomposedstate));
26*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree2(obj->realcomposeddata,obj->realcomposedstate));
27*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree2(obj->scalarcomposeddata,obj->scalarcomposedstate));
28b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
29b436f76fSVictor Eijkhout }
30b436f76fSVictor Eijkhout 
31e30d2299SSatish Balay /*@
32e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay    Collective on PetscObject
35e5c89e4eSSatish Balay 
36e5c89e4eSSatish Balay    Input Parameter:
37e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
38fcfd50ebSBarry Smith          This must be cast with a (PetscObject*), for example,
39fcfd50ebSBarry Smith          PetscObjectDestroy((PetscObject*)&mat);
40e5c89e4eSSatish Balay 
41e5c89e4eSSatish Balay    Level: beginner
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay @*/
44fcfd50ebSBarry Smith PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
45e5c89e4eSSatish Balay {
46e5c89e4eSSatish Balay   PetscFunctionBegin;
47*5f80ce2aSJacob Faibussowitsch   if (!obj || !*obj) PetscFunctionReturn(0);
486bf464f9SBarry Smith   PetscValidHeader(*obj,1);
49*5f80ce2aSJacob Faibussowitsch   PetscCheck((*obj)->bops->destroy,PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",(*obj)->class_name);
50*5f80ce2aSJacob Faibussowitsch   CHKERRQ((*(*obj)->bops->destroy)(obj));
51e5c89e4eSSatish Balay   PetscFunctionReturn(0);
52e5c89e4eSSatish Balay }
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay /*@C
55e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay    Collective on PetscObject
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay    Input Parameters:
60e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
61e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
62e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
63e5c89e4eSSatish Balay -  viewer - any PETSc viewer
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay    Level: intermediate
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay @*/
687087cfbeSBarry Smith PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
69e5c89e4eSSatish Balay {
70e5c89e4eSSatish Balay   PetscFunctionBegin;
71e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
72*5f80ce2aSJacob Faibussowitsch   PetscCheck(obj->bops->view,PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
73*5f80ce2aSJacob Faibussowitsch   if (!viewer) CHKERRQ(PetscViewerASCIIGetStdout(obj->comm,&viewer));
740700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
75e5c89e4eSSatish Balay 
76*5f80ce2aSJacob Faibussowitsch   CHKERRQ((*obj->bops->view)(obj,viewer));
77e5c89e4eSSatish Balay   PetscFunctionReturn(0);
78e5c89e4eSSatish Balay }
79e5c89e4eSSatish Balay 
802d747510SLisandro Dalcin /*@C
812d747510SLisandro Dalcin   PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed.
822d747510SLisandro Dalcin 
832d747510SLisandro Dalcin   Collective on PetscObject
842d747510SLisandro Dalcin 
852d747510SLisandro Dalcin   Input Parameters:
862d747510SLisandro Dalcin + obj   - the object
872d747510SLisandro Dalcin . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
882d747510SLisandro Dalcin - optionname - option to activate viewing
892d747510SLisandro Dalcin 
902d747510SLisandro Dalcin   Level: intermediate
912d747510SLisandro Dalcin 
922d747510SLisandro Dalcin @*/
932d747510SLisandro Dalcin PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[])
942d747510SLisandro Dalcin {
952d747510SLisandro Dalcin   PetscViewer       viewer;
962d747510SLisandro Dalcin   PetscBool         flg;
972d747510SLisandro Dalcin   static PetscBool  incall = PETSC_FALSE;
982d747510SLisandro Dalcin   PetscViewerFormat format;
992d747510SLisandro Dalcin   const char        *prefix;
1002d747510SLisandro Dalcin 
1012d747510SLisandro Dalcin   PetscFunctionBegin;
1022d747510SLisandro Dalcin   if (incall) PetscFunctionReturn(0);
1032d747510SLisandro Dalcin   incall = PETSC_TRUE;
1042d747510SLisandro Dalcin   prefix = bobj ? bobj->prefix : obj->prefix;
105*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg));
1062d747510SLisandro Dalcin   if (flg) {
107*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerPushFormat(viewer,format));
108*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectView(obj,viewer));
109*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFlush(viewer));
110*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerPopFormat(viewer));
111*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
1122d747510SLisandro Dalcin   }
1132d747510SLisandro Dalcin   incall = PETSC_FALSE;
1142d747510SLisandro Dalcin   PetscFunctionReturn(0);
1152d747510SLisandro Dalcin }
1162d747510SLisandro Dalcin 
117e5c89e4eSSatish Balay /*@C
118251f4c67SDmitry Karpeev    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
119e5c89e4eSSatish Balay 
120e5c89e4eSSatish Balay    Not Collective
121e5c89e4eSSatish Balay 
122e5c89e4eSSatish Balay    Input Parameters:
123e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
124e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
125251f4c67SDmitry Karpeev          PetscObjectTypeCompare((PetscObject)mat);
126e5c89e4eSSatish Balay -  type_name - string containing a type name
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay    Output Parameter:
129e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay    Level: intermediate
132e5c89e4eSSatish Balay 
133b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny()
134e5c89e4eSSatish Balay 
135e5c89e4eSSatish Balay @*/
136251f4c67SDmitry Karpeev PetscErrorCode  PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
137e5c89e4eSSatish Balay {
138e5c89e4eSSatish Balay   PetscFunctionBegin;
139*5f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(same,3);
140a297a907SKarl Rupp   if (!obj) *same = PETSC_FALSE;
141a297a907SKarl Rupp   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
142a297a907SKarl Rupp   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
143a297a907SKarl Rupp   else {
144e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
145e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
146*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp((char*)(obj->type_name),type_name,same));
147e5c89e4eSSatish Balay   }
148e5c89e4eSSatish Balay   PetscFunctionReturn(0);
149e5c89e4eSSatish Balay }
150e5c89e4eSSatish Balay 
1512b12f010SJed Brown /*@C
1524099cc6bSBarry Smith    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
1534099cc6bSBarry Smith 
1544099cc6bSBarry Smith    Not Collective
1554099cc6bSBarry Smith 
1564099cc6bSBarry Smith    Input Parameters:
1574099cc6bSBarry Smith +  mat - the matrix
1584099cc6bSBarry Smith -  type_name - string containing a type name
1594099cc6bSBarry Smith 
1604099cc6bSBarry Smith    Output Parameter:
1614099cc6bSBarry Smith .  same - PETSC_TRUE if it is of the same base type
1624099cc6bSBarry Smith 
1634099cc6bSBarry Smith    Level: intermediate
1644099cc6bSBarry Smith 
165b9e7e5c1SBarry Smith .seealso: PetscObjectTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny()
1664099cc6bSBarry Smith 
1674099cc6bSBarry Smith @*/
1684099cc6bSBarry Smith PetscErrorCode  PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
1694099cc6bSBarry Smith {
1704099cc6bSBarry Smith   PetscFunctionBegin;
171*5f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(same,3);
1724099cc6bSBarry Smith   if (!obj) *same = PETSC_FALSE;
1734099cc6bSBarry Smith   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
1744099cc6bSBarry Smith   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
1754099cc6bSBarry Smith   else {
1764099cc6bSBarry Smith     PetscValidHeader(obj,1);
1774099cc6bSBarry Smith     PetscValidCharPointer(type_name,2);
178*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrbeginswith((char*)(obj->type_name),type_name,same));
1794099cc6bSBarry Smith   }
1804099cc6bSBarry Smith   PetscFunctionReturn(0);
1814099cc6bSBarry Smith }
1824099cc6bSBarry Smith 
1834099cc6bSBarry Smith /*@C
184251f4c67SDmitry Karpeev    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
1852b12f010SJed Brown 
1862b12f010SJed Brown    Not Collective
1872b12f010SJed Brown 
1882b12f010SJed Brown    Input Parameters:
1892b12f010SJed Brown +  obj - any PETSc object, for example a Vec, Mat or KSP.
190251f4c67SDmitry Karpeev          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
1912b12f010SJed Brown -  type_name - string containing a type name, pass the empty string "" to terminate the list
1922b12f010SJed Brown 
1932b12f010SJed Brown    Output Parameter:
1942b12f010SJed Brown .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
1952b12f010SJed Brown 
1962b12f010SJed Brown    Level: intermediate
1972b12f010SJed Brown 
198b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
1992b12f010SJed Brown 
2002b12f010SJed Brown @*/
201251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
2022b12f010SJed Brown {
2032b12f010SJed Brown   va_list Argp;
2042b12f010SJed Brown 
2052b12f010SJed Brown   PetscFunctionBegin;
206*5f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(match,2);
2072b12f010SJed Brown   *match = PETSC_FALSE;
208f73a99e8SStefano Zampini   if (!obj) PetscFunctionReturn(0);
2092b12f010SJed Brown   va_start(Argp,type_name);
2102b12f010SJed Brown   while (type_name && type_name[0]) {
2112b12f010SJed Brown     PetscBool found;
212*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectTypeCompare(obj,type_name,&found));
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 
223b9e7e5c1SBarry Smith /*@C
224b9e7e5c1SBarry Smith    PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types.
225b9e7e5c1SBarry Smith 
226b9e7e5c1SBarry Smith    Not Collective
227b9e7e5c1SBarry Smith 
228b9e7e5c1SBarry Smith    Input Parameters:
229b9e7e5c1SBarry Smith +  obj - any PETSc object, for example a Vec, Mat or KSP.
230b9e7e5c1SBarry Smith          This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...);
231b9e7e5c1SBarry Smith -  type_name - string containing a type name, pass the empty string "" to terminate the list
232b9e7e5c1SBarry Smith 
233b9e7e5c1SBarry Smith    Output Parameter:
234b9e7e5c1SBarry Smith .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
235b9e7e5c1SBarry Smith 
236b9e7e5c1SBarry Smith    Level: intermediate
237b9e7e5c1SBarry Smith 
238b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
239b9e7e5c1SBarry Smith 
240b9e7e5c1SBarry Smith @*/
241b9e7e5c1SBarry Smith PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
242b9e7e5c1SBarry Smith {
243b9e7e5c1SBarry Smith   va_list Argp;
244b9e7e5c1SBarry Smith 
245b9e7e5c1SBarry Smith   PetscFunctionBegin;
246*5f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(match,2);
247b9e7e5c1SBarry Smith   *match = PETSC_FALSE;
248b9e7e5c1SBarry Smith   va_start(Argp,type_name);
249b9e7e5c1SBarry Smith   while (type_name && type_name[0]) {
250b9e7e5c1SBarry Smith     PetscBool found;
251*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectBaseTypeCompare(obj,type_name,&found));
252b9e7e5c1SBarry Smith     if (found) {
253b9e7e5c1SBarry Smith       *match = PETSC_TRUE;
254b9e7e5c1SBarry Smith       break;
255b9e7e5c1SBarry Smith     }
256b9e7e5c1SBarry Smith     type_name = va_arg(Argp,const char*);
257b9e7e5c1SBarry Smith   }
258b9e7e5c1SBarry Smith   va_end(Argp);
259b9e7e5c1SBarry Smith   PetscFunctionReturn(0);
260b9e7e5c1SBarry Smith }
261b9e7e5c1SBarry Smith 
2623cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
263e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2643cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
265e5c89e4eSSatish Balay 
266e5c89e4eSSatish Balay /*@C
267e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
268e5c89e4eSSatish Balay      PetscFinalize() is called.
269e5c89e4eSSatish Balay 
2703f9fe445SBarry Smith    Logically Collective on PetscObject
271e5c89e4eSSatish Balay 
272e5c89e4eSSatish Balay    Input Parameter:
273e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
274e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
275e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
276e5c89e4eSSatish Balay 
277e5c89e4eSSatish Balay    Level: developer
278e5c89e4eSSatish Balay 
279e5c89e4eSSatish Balay    Notes:
280e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
281e5c89e4eSSatish Balay     when PETSc ends.
282e5c89e4eSSatish Balay 
283e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
284e5c89e4eSSatish Balay @*/
2857087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
286e5c89e4eSSatish Balay {
287e5c89e4eSSatish Balay   PetscFunctionBegin;
288e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
289*5f80ce2aSJacob Faibussowitsch   PetscCheck(PetscObjectRegisterDestroy_Count < MAXREGDESOBJS,PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile %s with larger value for " PetscStringize_(MAXREGDESOBJS),MAXREGDESOBJS,__FILE__);
290*5f80ce2aSJacob Faibussowitsch   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
291e5c89e4eSSatish Balay   PetscFunctionReturn(0);
292e5c89e4eSSatish Balay }
293e5c89e4eSSatish Balay 
294e5c89e4eSSatish Balay /*@C
295e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
296e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
297e5c89e4eSSatish Balay 
2983f9fe445SBarry Smith    Logically Collective on individual PetscObjects
299e5c89e4eSSatish Balay 
300e5c89e4eSSatish Balay    Level: developer
301e5c89e4eSSatish Balay 
302e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
303e5c89e4eSSatish Balay @*/
3047087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroyAll(void)
305e5c89e4eSSatish Balay {
306e5c89e4eSSatish Balay   PetscFunctionBegin;
307*5f80ce2aSJacob Faibussowitsch   for (PetscInt i=0; i<PetscObjectRegisterDestroy_Count; i++) CHKERRQ(PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]));
3083cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
309e5c89e4eSSatish Balay   PetscFunctionReturn(0);
310e5c89e4eSSatish Balay }
311e5c89e4eSSatish Balay 
312eb8be38cSBarry Smith #define MAXREGFIN 256
313eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0;
31400a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
315eb8be38cSBarry Smith 
316eb8be38cSBarry Smith /*@C
317eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
318eb8be38cSBarry Smith 
319eb8be38cSBarry Smith    Not Collective
320eb8be38cSBarry Smith 
321eb8be38cSBarry Smith    Input Parameter:
322eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
323eb8be38cSBarry Smith 
324eb8be38cSBarry Smith    Level: developer
325eb8be38cSBarry Smith 
326eb8be38cSBarry Smith    Notes:
3272390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
328eb8be38cSBarry Smith 
329eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll()
330eb8be38cSBarry Smith @*/
3317087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
332eb8be38cSBarry Smith {
333f4aac215SBarry Smith   PetscFunctionBegin;
334*5f80ce2aSJacob Faibussowitsch   for (PetscInt i=0; i<PetscRegisterFinalize_Count; i++) {
335aee23540SBarry Smith     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
336f4aac215SBarry Smith   }
337*5f80ce2aSJacob Faibussowitsch   PetscCheck(PetscRegisterFinalize_Count < MAXREGFIN,PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile %s with larger value for " PetscStringize_(MAXREGFIN),MAXREGFIN,__FILE__);
338*5f80ce2aSJacob Faibussowitsch   PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
339eb8be38cSBarry Smith   PetscFunctionReturn(0);
340eb8be38cSBarry Smith }
341eb8be38cSBarry Smith 
342eb8be38cSBarry Smith /*@C
343eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
344eb8be38cSBarry Smith 
345eb8be38cSBarry Smith    Not Collective unless registered functions are collective
346eb8be38cSBarry Smith 
347eb8be38cSBarry Smith    Level: developer
348eb8be38cSBarry Smith 
349eb8be38cSBarry Smith .seealso: PetscRegisterFinalize()
350eb8be38cSBarry Smith @*/
3517087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalizeAll(void)
352eb8be38cSBarry Smith {
353eb8be38cSBarry Smith   PetscFunctionBegin;
354*5f80ce2aSJacob Faibussowitsch   for (PetscInt i=0; i<PetscRegisterFinalize_Count; i++) CHKERRQ((*PetscRegisterFinalize_Functions[i])());
355eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
356eb8be38cSBarry Smith   PetscFunctionReturn(0);
357eb8be38cSBarry Smith }
358