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