xref: /petsc/src/sys/objects/destroy.c (revision d34fcf5f3c1110c5dc2577f606d52f97e4a96ba3)
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 SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
177   PetscFunctionReturn(0);
178 }
179 
180 #undef __FUNCT__
181 #define __FUNCT__ "PetscObjectView"
182 /*@C
183    PetscObjectView - Views any PetscObject, regardless of the type.
184 
185    Collective on PetscObject
186 
187    Input Parameters:
188 +  obj - any PETSc object, for example a Vec, Mat or KSP.
189          This must be cast with a (PetscObject), for example,
190          PetscObjectView((PetscObject)mat,viewer);
191 -  viewer - any PETSc viewer
192 
193    Level: intermediate
194 
195 @*/
196 PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
197 {
198   PetscErrorCode ierr;
199 
200   PetscFunctionBegin;
201   PetscValidHeader(obj,1);
202   if (!viewer) {
203     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
204   }
205   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
206 
207   if (obj->bops->view) {
208     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
209   } else {
210     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
211   }
212   PetscFunctionReturn(0);
213 }
214 
215 #undef __FUNCT__
216 #define __FUNCT__ "PetscTypeCompare"
217 /*@C
218    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
219 
220    Not Collective
221 
222    Input Parameters:
223 +  obj - any PETSc object, for example a Vec, Mat or KSP.
224          This must be cast with a (PetscObject), for example,
225          PetscObjectDestroy((PetscObject)mat);
226 -  type_name - string containing a type name
227 
228    Output Parameter:
229 .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
230 
231    Level: intermediate
232 
233 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
234 
235    Concepts: comparing^object types
236    Concepts: types^comparing
237    Concepts: object type^comparing
238 
239 @*/
240 PetscErrorCode  PetscTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
241 {
242   PetscErrorCode ierr;
243 
244   PetscFunctionBegin;
245   if (!obj) {
246     *same = PETSC_FALSE;
247   } else if (!type_name && !obj->type_name) {
248     *same = PETSC_TRUE;
249   } else if (!type_name || !obj->type_name) {
250     *same = PETSC_FALSE;
251   } else {
252     PetscValidHeader(obj,1);
253     PetscValidCharPointer(type_name,2);
254     PetscValidPointer(same,3);
255     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
256   }
257   PetscFunctionReturn(0);
258 }
259 
260 #define MAXREGDESOBJS 256
261 static int         PetscObjectRegisterDestroy_Count = 0;
262 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
263 
264 #undef __FUNCT__
265 #define __FUNCT__ "PetscObjectRegisterDestroy"
266 /*@C
267    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
268      PetscFinalize() is called.
269 
270    Logically Collective on PetscObject
271 
272    Input Parameter:
273 .  obj - any PETSc object, for example a Vec, Mat or KSP.
274          This must be cast with a (PetscObject), for example,
275          PetscObjectRegisterDestroy((PetscObject)mat);
276 
277    Level: developer
278 
279    Notes:
280       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
281     when PETSc ends.
282 
283 .seealso: PetscObjectRegisterDestroyAll()
284 @*/
285 PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
286 {
287   PetscFunctionBegin;
288   PetscValidHeader(obj,1);
289   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) {
290     PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
291   } else {
292     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);
293 
294   }
295   PetscFunctionReturn(0);
296 }
297 
298 #undef __FUNCT__
299 #define __FUNCT__ "PetscObjectRegisterDestroyAll"
300 /*@C
301    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
302      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
303 
304    Logically Collective on individual PetscObjects
305 
306    Level: developer
307 
308 .seealso: PetscObjectRegisterDestroy()
309 @*/
310 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
311 {
312   PetscErrorCode ierr;
313   int i;
314 
315   PetscFunctionBegin;
316   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
317     ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
318   }
319   PetscObjectRegisterDestroy_Count = 0;
320   PetscFunctionReturn(0);
321 }
322 
323 
324 #define MAXREGFIN 256
325 static int         PetscRegisterFinalize_Count = 0;
326 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
327 
328 #undef __FUNCT__
329 #define __FUNCT__ "PetscRegisterFinalize"
330 /*@C
331    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
332 
333    Not Collective
334 
335    Input Parameter:
336 .  PetscErrorCode (*fun)(void) -
337 
338    Level: developer
339 
340    Notes:
341       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
342 
343 .seealso: PetscRegisterFinalizeAll()
344 @*/
345 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
346 {
347   PetscFunctionBegin;
348 
349   if (PetscRegisterFinalize_Count < MAXREGFIN) {
350     PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
351   } else {
352     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);
353 
354   }
355   PetscFunctionReturn(0);
356 }
357 
358 #undef __FUNCT__
359 #define __FUNCT__ "PetscRegisterFinalizeAll"
360 /*@C
361    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
362 
363    Not Collective unless registered functions are collective
364 
365    Level: developer
366 
367 .seealso: PetscRegisterFinalize()
368 @*/
369 PetscErrorCode  PetscRegisterFinalizeAll(void)
370 {
371   PetscErrorCode ierr;
372   int i;
373 
374   PetscFunctionBegin;
375   for (i=0; i<PetscRegisterFinalize_Count; i++) {
376     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
377   }
378   PetscRegisterFinalize_Count = 0;
379   PetscFunctionReturn(0);
380 }
381