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