xref: /petsc/src/sys/objects/destroy.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 
8*9371c9d4SSatish Balay PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj) {
9d42688cbSBarry Smith   PetscInt i;
10d42688cbSBarry Smith 
11b436f76fSVictor Eijkhout   PetscFunctionBegin;
12b436f76fSVictor Eijkhout   if (obj->intstar_idmax > 0) {
139566063dSJacob Faibussowitsch     for (i = 0; i < obj->intstar_idmax; i++) PetscCall(PetscFree(obj->intstarcomposeddata[i]));
149566063dSJacob Faibussowitsch     PetscCall(PetscFree2(obj->intstarcomposeddata, obj->intstarcomposedstate));
15b436f76fSVictor Eijkhout   }
16b436f76fSVictor Eijkhout   if (obj->realstar_idmax > 0) {
179566063dSJacob Faibussowitsch     for (i = 0; i < obj->realstar_idmax; i++) PetscCall(PetscFree(obj->realstarcomposeddata[i]));
189566063dSJacob Faibussowitsch     PetscCall(PetscFree2(obj->realstarcomposeddata, obj->realstarcomposedstate));
19b436f76fSVictor Eijkhout   }
20b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax > 0) {
219566063dSJacob Faibussowitsch     for (i = 0; i < obj->scalarstar_idmax; i++) PetscCall(PetscFree(obj->scalarstarcomposeddata[i]));
229566063dSJacob Faibussowitsch     PetscCall(PetscFree2(obj->scalarstarcomposeddata, obj->scalarstarcomposedstate));
23b436f76fSVictor Eijkhout   }
249566063dSJacob Faibussowitsch   PetscCall(PetscFree2(obj->intcomposeddata, obj->intcomposedstate));
259566063dSJacob Faibussowitsch   PetscCall(PetscFree2(obj->realcomposeddata, obj->realcomposedstate));
269566063dSJacob Faibussowitsch   PetscCall(PetscFree2(obj->scalarcomposeddata, obj->scalarcomposedstate));
27b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
28b436f76fSVictor Eijkhout }
29b436f76fSVictor Eijkhout 
30e30d2299SSatish Balay /*@
31e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
32e5c89e4eSSatish Balay 
33e5c89e4eSSatish Balay    Collective on PetscObject
34e5c89e4eSSatish Balay 
35e5c89e4eSSatish Balay    Input Parameter:
36e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
37fcfd50ebSBarry Smith          This must be cast with a (PetscObject*), for example,
38fcfd50ebSBarry Smith          PetscObjectDestroy((PetscObject*)&mat);
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay    Level: beginner
41e5c89e4eSSatish Balay 
42e5c89e4eSSatish Balay @*/
43*9371c9d4SSatish Balay PetscErrorCode PetscObjectDestroy(PetscObject *obj) {
44e5c89e4eSSatish Balay   PetscFunctionBegin;
455f80ce2aSJacob Faibussowitsch   if (!obj || !*obj) PetscFunctionReturn(0);
466bf464f9SBarry Smith   PetscValidHeader(*obj, 1);
475f80ce2aSJacob 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);
489566063dSJacob Faibussowitsch   PetscCall((*(*obj)->bops->destroy)(obj));
49e5c89e4eSSatish Balay   PetscFunctionReturn(0);
50e5c89e4eSSatish Balay }
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay /*@C
53e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
54e5c89e4eSSatish Balay 
55e5c89e4eSSatish Balay    Collective on PetscObject
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay    Input Parameters:
58e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
59e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
60e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
61e5c89e4eSSatish Balay -  viewer - any PETSc viewer
62e5c89e4eSSatish Balay 
63e5c89e4eSSatish Balay    Level: intermediate
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay @*/
66*9371c9d4SSatish Balay PetscErrorCode PetscObjectView(PetscObject obj, PetscViewer viewer) {
67e5c89e4eSSatish Balay   PetscFunctionBegin;
68e5c89e4eSSatish Balay   PetscValidHeader(obj, 1);
695f80ce2aSJacob Faibussowitsch   PetscCheck(obj->bops->view, PETSC_COMM_SELF, PETSC_ERR_SUP, "This PETSc object does not have a generic viewer routine");
709566063dSJacob Faibussowitsch   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(obj->comm, &viewer));
710700a824SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
72e5c89e4eSSatish Balay 
739566063dSJacob Faibussowitsch   PetscCall((*obj->bops->view)(obj, viewer));
74e5c89e4eSSatish Balay   PetscFunctionReturn(0);
75e5c89e4eSSatish Balay }
76e5c89e4eSSatish Balay 
772d747510SLisandro Dalcin /*@C
782d747510SLisandro Dalcin   PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed.
792d747510SLisandro Dalcin 
802d747510SLisandro Dalcin   Collective on PetscObject
812d747510SLisandro Dalcin 
822d747510SLisandro Dalcin   Input Parameters:
832d747510SLisandro Dalcin + obj   - the object
842d747510SLisandro Dalcin . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
85bb7acecfSBarry Smith - optionname - option string that is used to activate viewing
862d747510SLisandro Dalcin 
872d747510SLisandro Dalcin   Level: intermediate
882d747510SLisandro Dalcin 
892d747510SLisandro Dalcin @*/
90*9371c9d4SSatish Balay PetscErrorCode PetscObjectViewFromOptions(PetscObject obj, PetscObject bobj, const char optionname[]) {
912d747510SLisandro Dalcin   PetscViewer       viewer;
922d747510SLisandro Dalcin   PetscBool         flg;
932d747510SLisandro Dalcin   static PetscBool  incall = PETSC_FALSE;
942d747510SLisandro Dalcin   PetscViewerFormat format;
952d747510SLisandro Dalcin   const char       *prefix;
962d747510SLisandro Dalcin 
972d747510SLisandro Dalcin   PetscFunctionBegin;
982d747510SLisandro Dalcin   if (incall) PetscFunctionReturn(0);
992d747510SLisandro Dalcin   incall = PETSC_TRUE;
1002d747510SLisandro Dalcin   prefix = bobj ? bobj->prefix : obj->prefix;
1019566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj), obj->options, prefix, optionname, &viewer, &format, &flg));
1022d747510SLisandro Dalcin   if (flg) {
1039566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, format));
1049566063dSJacob Faibussowitsch     PetscCall(PetscObjectView(obj, viewer));
1059566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(viewer));
1069566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1079566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
1082d747510SLisandro Dalcin   }
1092d747510SLisandro Dalcin   incall = PETSC_FALSE;
1102d747510SLisandro Dalcin   PetscFunctionReturn(0);
1112d747510SLisandro Dalcin }
1122d747510SLisandro Dalcin 
113e5c89e4eSSatish Balay /*@C
114251f4c67SDmitry Karpeev    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
115e5c89e4eSSatish Balay 
116e5c89e4eSSatish Balay    Not Collective
117e5c89e4eSSatish Balay 
118e5c89e4eSSatish Balay    Input Parameters:
119e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
120e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
121251f4c67SDmitry Karpeev          PetscObjectTypeCompare((PetscObject)mat);
122e5c89e4eSSatish Balay -  type_name - string containing a type name
123e5c89e4eSSatish Balay 
124e5c89e4eSSatish Balay    Output Parameter:
125e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
126e5c89e4eSSatish Balay 
127e5c89e4eSSatish Balay    Level: intermediate
128e5c89e4eSSatish Balay 
129db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()`
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay @*/
132*9371c9d4SSatish Balay PetscErrorCode PetscObjectTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) {
133e5c89e4eSSatish Balay   PetscFunctionBegin;
1345f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(same, 3);
135a297a907SKarl Rupp   if (!obj) *same = PETSC_FALSE;
136a297a907SKarl Rupp   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
137a297a907SKarl Rupp   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
138a297a907SKarl Rupp   else {
139e5c89e4eSSatish Balay     PetscValidHeader(obj, 1);
140e5c89e4eSSatish Balay     PetscValidCharPointer(type_name, 2);
1419566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp((char *)(obj->type_name), type_name, same));
142e5c89e4eSSatish Balay   }
143e5c89e4eSSatish Balay   PetscFunctionReturn(0);
144e5c89e4eSSatish Balay }
145e5c89e4eSSatish Balay 
1462b12f010SJed Brown /*@C
1474099cc6bSBarry Smith    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
1484099cc6bSBarry Smith 
1494099cc6bSBarry Smith    Not Collective
1504099cc6bSBarry Smith 
1514099cc6bSBarry Smith    Input Parameters:
1524099cc6bSBarry Smith +  mat - the matrix
1534099cc6bSBarry Smith -  type_name - string containing a type name
1544099cc6bSBarry Smith 
1554099cc6bSBarry Smith    Output Parameter:
1564099cc6bSBarry Smith .  same - PETSC_TRUE if it is of the same base type
1574099cc6bSBarry Smith 
1584099cc6bSBarry Smith    Level: intermediate
1594099cc6bSBarry Smith 
160db781477SPatrick Sanan .seealso: `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()`
1614099cc6bSBarry Smith 
1624099cc6bSBarry Smith @*/
163*9371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) {
1644099cc6bSBarry Smith   PetscFunctionBegin;
1655f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(same, 3);
1664099cc6bSBarry Smith   if (!obj) *same = PETSC_FALSE;
1674099cc6bSBarry Smith   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
1684099cc6bSBarry Smith   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
1694099cc6bSBarry Smith   else {
1704099cc6bSBarry Smith     PetscValidHeader(obj, 1);
1714099cc6bSBarry Smith     PetscValidCharPointer(type_name, 2);
1729566063dSJacob Faibussowitsch     PetscCall(PetscStrbeginswith((char *)(obj->type_name), type_name, same));
1734099cc6bSBarry Smith   }
1744099cc6bSBarry Smith   PetscFunctionReturn(0);
1754099cc6bSBarry Smith }
1764099cc6bSBarry Smith 
1774099cc6bSBarry Smith /*@C
178251f4c67SDmitry Karpeev    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
1792b12f010SJed Brown 
1802b12f010SJed Brown    Not Collective
1812b12f010SJed Brown 
1822b12f010SJed Brown    Input Parameters:
1832b12f010SJed Brown +  obj - any PETSc object, for example a Vec, Mat or KSP.
184251f4c67SDmitry Karpeev          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
1852b12f010SJed Brown -  type_name - string containing a type name, pass the empty string "" to terminate the list
1862b12f010SJed Brown 
1872b12f010SJed Brown    Output Parameter:
1882b12f010SJed Brown .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
1892b12f010SJed Brown 
1902b12f010SJed Brown    Level: intermediate
1912b12f010SJed Brown 
192dee2f2dbSPierre Jolivet .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()`
1932b12f010SJed Brown 
1942b12f010SJed Brown @*/
195*9371c9d4SSatish Balay PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj, PetscBool *match, const char type_name[], ...) {
1962b12f010SJed Brown   va_list Argp;
1972b12f010SJed Brown 
1982b12f010SJed Brown   PetscFunctionBegin;
1995f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(match, 2);
2002b12f010SJed Brown   *match = PETSC_FALSE;
201f73a99e8SStefano Zampini   if (!obj) PetscFunctionReturn(0);
2022b12f010SJed Brown   va_start(Argp, type_name);
2032b12f010SJed Brown   while (type_name && type_name[0]) {
2042b12f010SJed Brown     PetscBool found;
2059566063dSJacob Faibussowitsch     PetscCall(PetscObjectTypeCompare(obj, type_name, &found));
2062b12f010SJed Brown     if (found) {
2072b12f010SJed Brown       *match = PETSC_TRUE;
2082b12f010SJed Brown       break;
2092b12f010SJed Brown     }
2102b12f010SJed Brown     type_name = va_arg(Argp, const char *);
2112b12f010SJed Brown   }
2122b12f010SJed Brown   va_end(Argp);
2132b12f010SJed Brown   PetscFunctionReturn(0);
2142b12f010SJed Brown }
2152b12f010SJed Brown 
216b9e7e5c1SBarry Smith /*@C
217b9e7e5c1SBarry Smith    PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types.
218b9e7e5c1SBarry Smith 
219b9e7e5c1SBarry Smith    Not Collective
220b9e7e5c1SBarry Smith 
221b9e7e5c1SBarry Smith    Input Parameters:
222b9e7e5c1SBarry Smith +  obj - any PETSc object, for example a Vec, Mat or KSP.
223b9e7e5c1SBarry Smith          This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...);
224b9e7e5c1SBarry Smith -  type_name - string containing a type name, pass the empty string "" to terminate the list
225b9e7e5c1SBarry Smith 
226b9e7e5c1SBarry Smith    Output Parameter:
227b9e7e5c1SBarry Smith .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
228b9e7e5c1SBarry Smith 
229b9e7e5c1SBarry Smith    Level: intermediate
230b9e7e5c1SBarry Smith 
231db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()`
232b9e7e5c1SBarry Smith 
233b9e7e5c1SBarry Smith @*/
234*9371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj, PetscBool *match, const char type_name[], ...) {
235b9e7e5c1SBarry Smith   va_list Argp;
236b9e7e5c1SBarry Smith 
237b9e7e5c1SBarry Smith   PetscFunctionBegin;
2385f80ce2aSJacob Faibussowitsch   PetscValidBoolPointer(match, 2);
239b9e7e5c1SBarry Smith   *match = PETSC_FALSE;
240b9e7e5c1SBarry Smith   va_start(Argp, type_name);
241b9e7e5c1SBarry Smith   while (type_name && type_name[0]) {
242b9e7e5c1SBarry Smith     PetscBool found;
2439566063dSJacob Faibussowitsch     PetscCall(PetscObjectBaseTypeCompare(obj, type_name, &found));
244b9e7e5c1SBarry Smith     if (found) {
245b9e7e5c1SBarry Smith       *match = PETSC_TRUE;
246b9e7e5c1SBarry Smith       break;
247b9e7e5c1SBarry Smith     }
248b9e7e5c1SBarry Smith     type_name = va_arg(Argp, const char *);
249b9e7e5c1SBarry Smith   }
250b9e7e5c1SBarry Smith   va_end(Argp);
251b9e7e5c1SBarry Smith   PetscFunctionReturn(0);
252b9e7e5c1SBarry Smith }
253b9e7e5c1SBarry Smith 
2543cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
255e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2563cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
257e5c89e4eSSatish Balay 
258e5c89e4eSSatish Balay /*@C
259e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
260e5c89e4eSSatish Balay      PetscFinalize() is called.
261e5c89e4eSSatish Balay 
2623f9fe445SBarry Smith    Logically Collective on PetscObject
263e5c89e4eSSatish Balay 
264e5c89e4eSSatish Balay    Input Parameter:
265e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
266e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
267e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
268e5c89e4eSSatish Balay 
269e5c89e4eSSatish Balay    Level: developer
270e5c89e4eSSatish Balay 
271e5c89e4eSSatish Balay    Notes:
272e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
273e5c89e4eSSatish Balay     when PETSc ends.
274e5c89e4eSSatish Balay 
275db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroyAll()`
276e5c89e4eSSatish Balay @*/
277*9371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) {
278e5c89e4eSSatish Balay   PetscFunctionBegin;
279e5c89e4eSSatish Balay   PetscValidHeader(obj, 1);
2805f80ce2aSJacob 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__);
2815f80ce2aSJacob Faibussowitsch   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
282e5c89e4eSSatish Balay   PetscFunctionReturn(0);
283e5c89e4eSSatish Balay }
284e5c89e4eSSatish Balay 
285e5c89e4eSSatish Balay /*@C
286e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
287e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
288e5c89e4eSSatish Balay 
2893f9fe445SBarry Smith    Logically Collective on individual PetscObjects
290e5c89e4eSSatish Balay 
291e5c89e4eSSatish Balay    Level: developer
292e5c89e4eSSatish Balay 
293db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroy()`
294e5c89e4eSSatish Balay @*/
295*9371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroyAll(void) {
296e5c89e4eSSatish Balay   PetscFunctionBegin;
2979566063dSJacob Faibussowitsch   for (PetscInt i = 0; i < PetscObjectRegisterDestroy_Count; i++) PetscCall(PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]));
2983cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
299e5c89e4eSSatish Balay   PetscFunctionReturn(0);
300e5c89e4eSSatish Balay }
301e5c89e4eSSatish Balay 
302eb8be38cSBarry Smith #define MAXREGFIN 256
303eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0;
30400a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
305eb8be38cSBarry Smith 
306eb8be38cSBarry Smith /*@C
307eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
308eb8be38cSBarry Smith 
309eb8be38cSBarry Smith    Not Collective
310eb8be38cSBarry Smith 
311eb8be38cSBarry Smith    Input Parameter:
312eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
313eb8be38cSBarry Smith 
314eb8be38cSBarry Smith    Level: developer
315eb8be38cSBarry Smith 
316eb8be38cSBarry Smith    Notes:
3172390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
318eb8be38cSBarry Smith 
319db781477SPatrick Sanan .seealso: `PetscRegisterFinalizeAll()`
320eb8be38cSBarry Smith @*/
321*9371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) {
322f4aac215SBarry Smith   PetscFunctionBegin;
3235f80ce2aSJacob Faibussowitsch   for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) {
324aee23540SBarry Smith     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
325f4aac215SBarry Smith   }
3265f80ce2aSJacob 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__);
3275f80ce2aSJacob Faibussowitsch   PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
328eb8be38cSBarry Smith   PetscFunctionReturn(0);
329eb8be38cSBarry Smith }
330eb8be38cSBarry Smith 
331eb8be38cSBarry Smith /*@C
332eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
333eb8be38cSBarry Smith 
334eb8be38cSBarry Smith    Not Collective unless registered functions are collective
335eb8be38cSBarry Smith 
336eb8be38cSBarry Smith    Level: developer
337eb8be38cSBarry Smith 
338db781477SPatrick Sanan .seealso: `PetscRegisterFinalize()`
339eb8be38cSBarry Smith @*/
340*9371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalizeAll(void) {
341eb8be38cSBarry Smith   PetscFunctionBegin;
3429566063dSJacob Faibussowitsch   for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) PetscCall((*PetscRegisterFinalize_Functions[i])());
343eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
344eb8be38cSBarry Smith   PetscFunctionReturn(0);
345eb8be38cSBarry Smith }
346