xref: /petsc/src/sys/objects/destroy.c (revision 564995642f26fedf5b90835b7b886ef094556616)
1 
2 /*
3      Provides utility routines for manulating any type of PETSc object.
4 */
5 #include <petsc/private/petscimpl.h>  /*I   "petscsys.h"    I*/
6 #include <petscviewer.h>
7 
8 PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
9 {
10   PetscErrorCode ierr;
11   PetscInt       i;
12 
13   PetscFunctionBegin;
14   if (obj->intstar_idmax>0) {
15     for (i=0; i<obj->intstar_idmax; i++) {
16       ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr);
17     }
18     ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr);
19     ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr);
20   }
21   if (obj->realstar_idmax>0) {
22     for (i=0; i<obj->realstar_idmax; i++) {
23       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
24     }
25     ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr);
26     ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr);
27   }
28   if (obj->scalarstar_idmax>0) {
29     for (i=0; i<obj->scalarstar_idmax; i++) {
30       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
31     }
32     ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr);
33     ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr);
34   }
35   ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr);
36   ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr);
37   ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr);
38   ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr);
39   ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr);
40   ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr);
41   PetscFunctionReturn(0);
42 }
43 
44 /*@
45    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
46 
47    Collective on PetscObject
48 
49    Input Parameter:
50 .  obj - any PETSc object, for example a Vec, Mat or KSP.
51          This must be cast with a (PetscObject*), for example,
52          PetscObjectDestroy((PetscObject*)&mat);
53 
54    Level: beginner
55 
56     Concepts: destroying object
57     Concepts: freeing object
58     Concepts: deleting object
59 
60 @*/
61 PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
62 {
63   PetscErrorCode ierr;
64 
65   PetscFunctionBegin;
66   if (!*obj) PetscFunctionReturn(0);
67   PetscValidHeader(*obj,1);
68   if (*obj && (*obj)->bops->destroy) {
69     ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr);
70   } 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);
71   PetscFunctionReturn(0);
72 }
73 
74 /*@C
75    PetscObjectView - Views any PetscObject, regardless of the type.
76 
77    Collective on PetscObject
78 
79    Input Parameters:
80 +  obj - any PETSc object, for example a Vec, Mat or KSP.
81          This must be cast with a (PetscObject), for example,
82          PetscObjectView((PetscObject)mat,viewer);
83 -  viewer - any PETSc viewer
84 
85    Level: intermediate
86 
87 @*/
88 PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
89 {
90   PetscErrorCode ierr;
91 
92   PetscFunctionBegin;
93   PetscValidHeader(obj,1);
94   if (!viewer) {
95     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
96   }
97   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
98 
99   if (obj->bops->view) {
100     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
101   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
102   PetscFunctionReturn(0);
103 }
104 
105 #define CHKERRQI(incall,ierr) if (ierr) {incall = PETSC_FALSE; CHKERRQ(ierr);}
106 
107 /*@C
108   PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed.
109 
110   Collective on PetscObject
111 
112   Input Parameters:
113 + obj   - the object
114 . bobj  - optional other object that provides prefix (if NULL then the prefix in obj is used)
115 - optionname - option to activate viewing
116 
117   Level: intermediate
118 
119 @*/
120 PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[])
121 {
122   PetscErrorCode    ierr;
123   PetscViewer       viewer;
124   PetscBool         flg;
125   static PetscBool  incall = PETSC_FALSE;
126   PetscViewerFormat format;
127   const char        *prefix;
128 
129   PetscFunctionBegin;
130   if (incall) PetscFunctionReturn(0);
131   incall = PETSC_TRUE;
132   prefix = bobj ? bobj->prefix : obj->prefix;
133   ierr   = PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg);CHKERRQI(incall,ierr);
134   if (flg) {
135     ierr = PetscViewerPushFormat(viewer,format);CHKERRQI(incall,ierr);
136     ierr = PetscObjectView(obj,viewer);CHKERRQI(incall,ierr);
137     ierr = PetscViewerPopFormat(viewer);CHKERRQI(incall,ierr);
138     ierr = PetscViewerDestroy(&viewer);CHKERRQI(incall,ierr);
139   }
140   incall = PETSC_FALSE;
141   PetscFunctionReturn(0);
142 }
143 
144 /*@C
145    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
146 
147    Not Collective
148 
149    Input Parameters:
150 +  obj - any PETSc object, for example a Vec, Mat or KSP.
151          This must be cast with a (PetscObject), for example,
152          PetscObjectTypeCompare((PetscObject)mat);
153 -  type_name - string containing a type name
154 
155    Output Parameter:
156 .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
157 
158    Level: intermediate
159 
160 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
161 
162    Concepts: comparing^object types
163    Concepts: types^comparing
164    Concepts: object type^comparpeing
165 
166 @*/
167 PetscErrorCode  PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
168 {
169   PetscErrorCode ierr;
170 
171   PetscFunctionBegin;
172   PetscValidPointer(same,3);
173   if (!obj) *same = PETSC_FALSE;
174   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
175   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
176   else {
177     PetscValidHeader(obj,1);
178     PetscValidCharPointer(type_name,2);
179     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
180   }
181   PetscFunctionReturn(0);
182 }
183 
184 /*@C
185    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
186 
187    Not Collective
188 
189    Input Parameters:
190 +  mat - the matrix
191 -  type_name - string containing a type name
192 
193    Output Parameter:
194 .  same - PETSC_TRUE if it is of the same base type
195 
196    Level: intermediate
197 
198 .seealso: PetscObjectTypeCompare(), PetscObjectTypeCompareAny()
199 
200 @*/
201 PetscErrorCode  PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
202 {
203   PetscErrorCode ierr;
204 
205   PetscFunctionBegin;
206   PetscValidPointer(same,3);
207   if (!obj) *same = PETSC_FALSE;
208   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
209   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
210   else {
211     PetscValidHeader(obj,1);
212     PetscValidCharPointer(type_name,2);
213     ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
214   }
215   PetscFunctionReturn(0);
216 }
217 
218 /*@C
219    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
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, PetscObjectTypeCompareAny((PetscObject)mat,...);
226 -  type_name - string containing a type name, pass the empty string "" to terminate the list
227 
228    Output Parameter:
229 .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
230 
231    Level: intermediate
232 
233 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare()
234 
235    Concepts: comparing^object types
236    Concepts: types^comparing
237    Concepts: object type^comparing
238 
239 @*/
240 PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
241 {
242   PetscErrorCode ierr;
243   va_list        Argp;
244 
245   PetscFunctionBegin;
246   PetscValidPointer(match,3);
247   *match = PETSC_FALSE;
248   va_start(Argp,type_name);
249   while (type_name && type_name[0]) {
250     PetscBool found;
251     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
252     if (found) {
253       *match = PETSC_TRUE;
254       break;
255     }
256     type_name = va_arg(Argp,const char*);
257   }
258   va_end(Argp);
259   PetscFunctionReturn(0);
260 }
261 
262 #define MAXREGDESOBJS 256
263 static int         PetscObjectRegisterDestroy_Count = 0;
264 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
265 
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) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
290   else 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);
291   PetscFunctionReturn(0);
292 }
293 
294 /*@C
295    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
296      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
297 
298    Logically Collective on individual PetscObjects
299 
300    Level: developer
301 
302 .seealso: PetscObjectRegisterDestroy()
303 @*/
304 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
305 {
306   PetscErrorCode ierr;
307   PetscInt       i;
308 
309   PetscFunctionBegin;
310   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
311     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
312   }
313   PetscObjectRegisterDestroy_Count = 0;
314   PetscFunctionReturn(0);
315 }
316 
317 
318 #define MAXREGFIN 256
319 static int PetscRegisterFinalize_Count = 0;
320 static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
321 
322 /*@C
323    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
324 
325    Not Collective
326 
327    Input Parameter:
328 .  PetscErrorCode (*fun)(void) -
329 
330    Level: developer
331 
332    Notes:
333       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
334 
335 .seealso: PetscRegisterFinalizeAll()
336 @*/
337 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
338 {
339   PetscInt i;
340 
341   PetscFunctionBegin;
342   for (i=0; i<PetscRegisterFinalize_Count; i++) {
343     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
344   }
345   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
346   else 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);
347   PetscFunctionReturn(0);
348 }
349 
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   PetscInt       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