xref: /petsc/src/sys/objects/destroy.c (revision 7d0a6c19129e7069c8a40e210b34ed62989173db)
1*7d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5d382aafbSBarry Smith #include "petscsys.h"  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
77adad957SLisandro Dalcin typedef struct _p_GenericObject* GenericObject;
87adad957SLisandro Dalcin 
97adad957SLisandro Dalcin struct _p_GenericObject {
10e5c89e4eSSatish Balay   PETSCHEADER(int);
11e5c89e4eSSatish Balay };
12e5c89e4eSSatish Balay 
13d42688cbSBarry Smith #undef __FUNCT__
14d42688cbSBarry Smith #define __FUNCT__ "PetscObjectDestroy_GenericObject"
157adad957SLisandro Dalcin PetscErrorCode PetscObjectDestroy_GenericObject(GenericObject obj)
16e5c89e4eSSatish Balay {
17d63b26baSBarry Smith   PetscErrorCode ierr;
18d63b26baSBarry Smith   PetscFunctionBegin;
19d63b26baSBarry Smith   PetscValidHeader(obj,1);
207adad957SLisandro Dalcin   if (--((PetscObject)obj)->refct > 0) PetscFunctionReturn(0);
21d63b26baSBarry Smith   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
22d63b26baSBarry Smith   PetscFunctionReturn(0);
23e5c89e4eSSatish Balay }
24e5c89e4eSSatish Balay 
25d42688cbSBarry Smith #undef __FUNCT__
26d42688cbSBarry Smith #define __FUNCT__ "PetscComposedQuantitiesDestroy"
27b436f76fSVictor Eijkhout PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
28b436f76fSVictor Eijkhout {
29d42688cbSBarry Smith   PetscErrorCode ierr;
30d42688cbSBarry Smith   PetscInt       i;
31d42688cbSBarry Smith 
32b436f76fSVictor Eijkhout   PetscFunctionBegin;
33b436f76fSVictor Eijkhout   if (obj->intstar_idmax>0) {
34b436f76fSVictor Eijkhout     for (i=0; i<obj->intstar_idmax; i++) {
35b436f76fSVictor Eijkhout       ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr);
36b436f76fSVictor Eijkhout     }
37b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr);
38b436f76fSVictor Eijkhout     ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr);
39b436f76fSVictor Eijkhout   }
40b436f76fSVictor Eijkhout   if (obj->realstar_idmax>0) {
41b436f76fSVictor Eijkhout     for (i=0; i<obj->realstar_idmax; i++) {
42b436f76fSVictor Eijkhout       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
43b436f76fSVictor Eijkhout     }
44b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr);
45b436f76fSVictor Eijkhout     ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr);
46b436f76fSVictor Eijkhout   }
47b436f76fSVictor Eijkhout   if (obj->scalarstar_idmax>0) {
48b436f76fSVictor Eijkhout     for (i=0; i<obj->scalarstar_idmax; i++) {
49b436f76fSVictor Eijkhout       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
50b436f76fSVictor Eijkhout     }
51b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr);
52b436f76fSVictor Eijkhout     ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr);
53b436f76fSVictor Eijkhout   }
54d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr);
55d42688cbSBarry Smith   ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr);
56d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr);
57d42688cbSBarry Smith   ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr);
58d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr);
59d42688cbSBarry Smith   ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr);
60b436f76fSVictor Eijkhout   PetscFunctionReturn(0);
61b436f76fSVictor Eijkhout }
62b436f76fSVictor Eijkhout 
63e5c89e4eSSatish Balay #undef __FUNCT__
64e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCreate"
65e5c89e4eSSatish Balay /*@C
66e5c89e4eSSatish Balay    PetscObjectCreate - Creates a PetscObject
67e5c89e4eSSatish Balay 
68e5c89e4eSSatish Balay    Collective on PetscObject
69e5c89e4eSSatish Balay 
70e5c89e4eSSatish Balay    Input Parameter:
71e5c89e4eSSatish Balay .  comm - An MPI communicator
72e5c89e4eSSatish Balay 
73e5c89e4eSSatish Balay    Output Parameter:
74e5c89e4eSSatish Balay .  obj - The object
75e5c89e4eSSatish Balay 
76d63b26baSBarry Smith    Level: developer
77d63b26baSBarry Smith 
787adad957SLisandro Dalcin    Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_GenericObject()
79d63b26baSBarry Smith           to make new object classes.
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay     Concepts: destroying object
82e5c89e4eSSatish Balay     Concepts: freeing object
83e5c89e4eSSatish Balay     Concepts: deleting object
84e5c89e4eSSatish Balay 
85e5c89e4eSSatish Balay @*/
867087cfbeSBarry Smith PetscErrorCode  PetscObjectCreate(MPI_Comm comm, PetscObject *obj)
87e5c89e4eSSatish Balay {
887adad957SLisandro Dalcin   GenericObject  o;
89e5c89e4eSSatish Balay   PetscErrorCode ierr;
90e5c89e4eSSatish Balay 
91e5c89e4eSSatish Balay   PetscFunctionBegin;
92e5c89e4eSSatish Balay   PetscValidPointer(obj,2);
93e5c89e4eSSatish Balay #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
943460a69eSHong Zhang   ierr = PetscSysInitializePackage(PETSC_NULL);CHKERRQ(ierr);
95e5c89e4eSSatish Balay #endif
960700a824SBarry Smith   ierr = PetscHeaderCreate(o,_p_GenericObject,-1,PETSC_OBJECT_CLASSID,0,"PetscObject",comm,PetscObjectDestroy_GenericObject,0);CHKERRQ(ierr);
97e5c89e4eSSatish Balay   /* records not yet defined in PetscObject
98e5c89e4eSSatish Balay   o->data        = 0;
99e5c89e4eSSatish Balay   o->setupcalled = 0;
100e5c89e4eSSatish Balay   */
1017adad957SLisandro Dalcin   *obj = (PetscObject)o;
102e5c89e4eSSatish Balay   PetscFunctionReturn(0);
103e5c89e4eSSatish Balay }
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay #undef __FUNCT__
106f86e92e0SMatthew Knepley #define __FUNCT__ "PetscObjectCreateGeneric"
107f86e92e0SMatthew Knepley /*@C
108f86e92e0SMatthew Knepley    PetscObjectCreateGeneric - Creates a PetscObject
109f86e92e0SMatthew Knepley 
110f86e92e0SMatthew Knepley    Collective on PetscObject
111f86e92e0SMatthew Knepley 
112f86e92e0SMatthew Knepley    Input Parameter:
113f86e92e0SMatthew Knepley +  comm - An MPI communicator
1140700a824SBarry Smith .  classid - The class classid
115f86e92e0SMatthew Knepley -  name - The class name
116f86e92e0SMatthew Knepley 
117f86e92e0SMatthew Knepley    Output Parameter:
118f86e92e0SMatthew Knepley .  obj - The object
119f86e92e0SMatthew Knepley 
120f86e92e0SMatthew Knepley    Level: developer
121f86e92e0SMatthew Knepley 
1227adad957SLisandro Dalcin    Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_GenericObject()
123f86e92e0SMatthew Knepley           to make new object classes.
124f86e92e0SMatthew Knepley 
125f86e92e0SMatthew Knepley     Concepts: destroying object
126f86e92e0SMatthew Knepley     Concepts: freeing object
127f86e92e0SMatthew Knepley     Concepts: deleting object
128f86e92e0SMatthew Knepley 
129f86e92e0SMatthew Knepley @*/
1307087cfbeSBarry Smith PetscErrorCode  PetscObjectCreateGeneric(MPI_Comm comm, PetscClassId classid, const char name[], PetscObject *obj)
131f86e92e0SMatthew Knepley {
1327adad957SLisandro Dalcin   GenericObject  o;
133f86e92e0SMatthew Knepley   PetscErrorCode ierr;
134f86e92e0SMatthew Knepley 
135f86e92e0SMatthew Knepley   PetscFunctionBegin;
136f86e92e0SMatthew Knepley   PetscValidPointer(obj,2);
137f86e92e0SMatthew Knepley #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
1383460a69eSHong Zhang   ierr = PetscSysInitializePackage(PETSC_NULL);CHKERRQ(ierr);
139f86e92e0SMatthew Knepley #endif
1400700a824SBarry Smith   ierr = PetscHeaderCreate(o,_p_GenericObject,-1,classid,0,name,comm,PetscObjectDestroy_GenericObject,0);CHKERRQ(ierr);
141f86e92e0SMatthew Knepley   /* records not yet defined in PetscObject
142f86e92e0SMatthew Knepley   o->data        = 0;
143f86e92e0SMatthew Knepley   o->setupcalled = 0;
144f86e92e0SMatthew Knepley   */
1457adad957SLisandro Dalcin   *obj = (PetscObject)o;
146f86e92e0SMatthew Knepley   PetscFunctionReturn(0);
147f86e92e0SMatthew Knepley }
148f86e92e0SMatthew Knepley 
149f86e92e0SMatthew Knepley #undef __FUNCT__
150e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDestroy"
151e30d2299SSatish Balay /*@
152e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
153e5c89e4eSSatish Balay 
154e5c89e4eSSatish Balay    Collective on PetscObject
155e5c89e4eSSatish Balay 
156e5c89e4eSSatish Balay    Input Parameter:
157e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
158e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
159e5c89e4eSSatish Balay          PetscObjectDestroy((PetscObject)mat);
160e5c89e4eSSatish Balay 
161e5c89e4eSSatish Balay    Level: beginner
162e5c89e4eSSatish Balay 
163e5c89e4eSSatish Balay     Concepts: destroying object
164e5c89e4eSSatish Balay     Concepts: freeing object
165e5c89e4eSSatish Balay     Concepts: deleting object
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay @*/
1687087cfbeSBarry Smith PetscErrorCode  PetscObjectDestroy(PetscObject obj)
169e5c89e4eSSatish Balay {
170e5c89e4eSSatish Balay   PetscErrorCode ierr;
171e5c89e4eSSatish Balay 
172e5c89e4eSSatish Balay   PetscFunctionBegin;
173e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
174e5c89e4eSSatish Balay   if (obj->bops->destroy) {
175e5c89e4eSSatish Balay     ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr);
176e5c89e4eSSatish Balay   } else {
177e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
178e5c89e4eSSatish Balay   }
179e5c89e4eSSatish Balay   PetscFunctionReturn(0);
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay 
182e5c89e4eSSatish Balay #undef __FUNCT__
183e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectView"
184e5c89e4eSSatish Balay /*@C
185e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay    Collective on PetscObject
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay    Input Parameters:
190e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
191e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
192e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
193e5c89e4eSSatish Balay -  viewer - any PETSc viewer
194e5c89e4eSSatish Balay 
195e5c89e4eSSatish Balay    Level: intermediate
196e5c89e4eSSatish Balay 
197e5c89e4eSSatish Balay @*/
1987087cfbeSBarry Smith PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
199e5c89e4eSSatish Balay {
200e5c89e4eSSatish Balay   PetscErrorCode ierr;
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   PetscFunctionBegin;
203e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
2043050cee2SBarry Smith   if (!viewer) {
2053050cee2SBarry Smith     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
2063050cee2SBarry Smith   }
2070700a824SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
208e5c89e4eSSatish Balay 
209e5c89e4eSSatish Balay   if (obj->bops->view) {
210e5c89e4eSSatish Balay     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
211e5c89e4eSSatish Balay   } else {
212e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
213e5c89e4eSSatish Balay   }
214e5c89e4eSSatish Balay   PetscFunctionReturn(0);
215e5c89e4eSSatish Balay }
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay #undef __FUNCT__
218e5c89e4eSSatish Balay #define __FUNCT__ "PetscTypeCompare"
219e5c89e4eSSatish Balay /*@C
220e5c89e4eSSatish Balay    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Not Collective
223e5c89e4eSSatish Balay 
224e5c89e4eSSatish Balay    Input Parameters:
225e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
226e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
227e5c89e4eSSatish Balay          PetscObjectDestroy((PetscObject)mat);
228e5c89e4eSSatish Balay -  type_name - string containing a type name
229e5c89e4eSSatish Balay 
230e5c89e4eSSatish Balay    Output Parameter:
231e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay    Level: intermediate
234e5c89e4eSSatish Balay 
235e5c89e4eSSatish Balay .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
236e5c89e4eSSatish Balay 
237e5c89e4eSSatish Balay    Concepts: comparing^object types
238e5c89e4eSSatish Balay    Concepts: types^comparing
239e5c89e4eSSatish Balay    Concepts: object type^comparing
240e5c89e4eSSatish Balay 
241e5c89e4eSSatish Balay @*/
2427087cfbeSBarry Smith PetscErrorCode  PetscTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
243e5c89e4eSSatish Balay {
244e5c89e4eSSatish Balay   PetscErrorCode ierr;
245e5c89e4eSSatish Balay 
246e5c89e4eSSatish Balay   PetscFunctionBegin;
247e5c89e4eSSatish Balay   if (!obj) {
248e5c89e4eSSatish Balay     *same = PETSC_FALSE;
249e5c89e4eSSatish Balay   } else if (!type_name && !obj->type_name) {
250e5c89e4eSSatish Balay     *same = PETSC_TRUE;
251e5c89e4eSSatish Balay   } else if (!type_name || !obj->type_name) {
252e5c89e4eSSatish Balay     *same = PETSC_FALSE;
253e5c89e4eSSatish Balay   } else {
254e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
255e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
256e5c89e4eSSatish Balay     PetscValidPointer(same,3);
257e5c89e4eSSatish Balay     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
258e5c89e4eSSatish Balay   }
259e5c89e4eSSatish Balay   PetscFunctionReturn(0);
260e5c89e4eSSatish Balay }
261e5c89e4eSSatish Balay 
2623cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256
263e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
2643cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
265e5c89e4eSSatish Balay 
266e5c89e4eSSatish Balay #undef __FUNCT__
267e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroy"
268e5c89e4eSSatish Balay /*@C
269e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
270e5c89e4eSSatish Balay      PetscFinalize() is called.
271e5c89e4eSSatish Balay 
2723f9fe445SBarry Smith    Logically Collective on PetscObject
273e5c89e4eSSatish Balay 
274e5c89e4eSSatish Balay    Input Parameter:
275e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
276e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
277e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
278e5c89e4eSSatish Balay 
279e5c89e4eSSatish Balay    Level: developer
280e5c89e4eSSatish Balay 
281e5c89e4eSSatish Balay    Notes:
282e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
283e5c89e4eSSatish Balay     when PETSc ends.
284e5c89e4eSSatish Balay 
285e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
286e5c89e4eSSatish Balay @*/
2877087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
288e5c89e4eSSatish Balay {
289e5c89e4eSSatish Balay   PetscFunctionBegin;
290e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
2913cfa8680SLisandro Dalcin   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) {
292e5c89e4eSSatish Balay     PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
2933cfa8680SLisandro Dalcin   } else {
294e32f2f54SBarry 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);
2953cfa8680SLisandro Dalcin 
2963cfa8680SLisandro Dalcin   }
297e5c89e4eSSatish Balay   PetscFunctionReturn(0);
298e5c89e4eSSatish Balay }
299e5c89e4eSSatish Balay 
300e5c89e4eSSatish Balay #undef __FUNCT__
301e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroyAll"
302e5c89e4eSSatish Balay /*@C
303e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
304e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
305e5c89e4eSSatish Balay 
3063f9fe445SBarry Smith    Logically Collective on individual PetscObjects
307e5c89e4eSSatish Balay 
308e5c89e4eSSatish Balay    Level: developer
309e5c89e4eSSatish Balay 
310e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
311e5c89e4eSSatish Balay @*/
3127087cfbeSBarry Smith PetscErrorCode  PetscObjectRegisterDestroyAll(void)
313e5c89e4eSSatish Balay {
314e5c89e4eSSatish Balay   PetscErrorCode ierr;
315e5c89e4eSSatish Balay   int i;
316e5c89e4eSSatish Balay 
317e5c89e4eSSatish Balay   PetscFunctionBegin;
318e5c89e4eSSatish Balay   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
319e5c89e4eSSatish Balay     ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
320e5c89e4eSSatish Balay   }
3213cfa8680SLisandro Dalcin   PetscObjectRegisterDestroy_Count = 0;
322e5c89e4eSSatish Balay   PetscFunctionReturn(0);
323e5c89e4eSSatish Balay }
324e5c89e4eSSatish Balay 
325e5c89e4eSSatish Balay 
326eb8be38cSBarry Smith #define MAXREGFIN 256
327eb8be38cSBarry Smith static int         PetscRegisterFinalize_Count = 0;
328eb8be38cSBarry Smith static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
329eb8be38cSBarry Smith 
330eb8be38cSBarry Smith #undef __FUNCT__
331eb8be38cSBarry Smith #define __FUNCT__ "PetscRegisterFinalize"
332eb8be38cSBarry Smith /*@C
333eb8be38cSBarry Smith    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
334eb8be38cSBarry Smith 
335eb8be38cSBarry Smith    Not Collective
336eb8be38cSBarry Smith 
337eb8be38cSBarry Smith    Input Parameter:
338eb8be38cSBarry Smith .  PetscErrorCode (*fun)(void) -
339eb8be38cSBarry Smith 
340eb8be38cSBarry Smith    Level: developer
341eb8be38cSBarry Smith 
342eb8be38cSBarry Smith    Notes:
3432390153bSJed Brown       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
344eb8be38cSBarry Smith 
345eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll()
346eb8be38cSBarry Smith @*/
3477087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
348eb8be38cSBarry Smith {
349eb8be38cSBarry Smith   PetscFunctionBegin;
350eb8be38cSBarry Smith 
351eb8be38cSBarry Smith   if (PetscRegisterFinalize_Count < MAXREGFIN) {
352eb8be38cSBarry Smith     PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
353eb8be38cSBarry Smith   } else {
354e32f2f54SBarry 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);
355eb8be38cSBarry Smith 
356eb8be38cSBarry Smith   }
357eb8be38cSBarry Smith   PetscFunctionReturn(0);
358eb8be38cSBarry Smith }
359eb8be38cSBarry Smith 
360eb8be38cSBarry Smith #undef __FUNCT__
36153c77d0aSJed Brown #define __FUNCT__ "PetscRegisterFinalizeAll"
362eb8be38cSBarry Smith /*@C
363eb8be38cSBarry Smith    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
364eb8be38cSBarry Smith 
365eb8be38cSBarry Smith    Not Collective unless registered functions are collective
366eb8be38cSBarry Smith 
367eb8be38cSBarry Smith    Level: developer
368eb8be38cSBarry Smith 
369eb8be38cSBarry Smith .seealso: PetscRegisterFinalize()
370eb8be38cSBarry Smith @*/
3717087cfbeSBarry Smith PetscErrorCode  PetscRegisterFinalizeAll(void)
372eb8be38cSBarry Smith {
373eb8be38cSBarry Smith   PetscErrorCode ierr;
374eb8be38cSBarry Smith   int i;
375eb8be38cSBarry Smith 
376eb8be38cSBarry Smith   PetscFunctionBegin;
377eb8be38cSBarry Smith   for (i=0; i<PetscRegisterFinalize_Count; i++) {
378eb8be38cSBarry Smith     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
379eb8be38cSBarry Smith   }
380eb8be38cSBarry Smith   PetscRegisterFinalize_Count = 0;
381eb8be38cSBarry Smith   PetscFunctionReturn(0);
382eb8be38cSBarry Smith }
383