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