xref: /petsc/src/sys/objects/destroy.c (revision a5a49157e8f0cda1ee246d4b38ccd40aa8bd8906)
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),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   if (!obj) *same = PETSC_FALSE;
173   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
174   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
175   else {
176     PetscValidHeader(obj,1);
177     PetscValidCharPointer(type_name,2);
178     PetscValidPointer(same,3);
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   if (!obj) *same = PETSC_FALSE;
207   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
208   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
209   else {
210     PetscValidHeader(obj,1);
211     PetscValidCharPointer(type_name,2);
212     PetscValidPointer(same,3);
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   *match = PETSC_FALSE;
247   va_start(Argp,type_name);
248   while (type_name && type_name[0]) {
249     PetscBool found;
250     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
251     if (found) {
252       *match = PETSC_TRUE;
253       break;
254     }
255     type_name = va_arg(Argp,const char*);
256   }
257   va_end(Argp);
258   PetscFunctionReturn(0);
259 }
260 
261 #define MAXREGDESOBJS 256
262 static int         PetscObjectRegisterDestroy_Count = 0;
263 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
264 
265 /*@C
266    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
267      PetscFinalize() is called.
268 
269    Logically Collective on PetscObject
270 
271    Input Parameter:
272 .  obj - any PETSc object, for example a Vec, Mat or KSP.
273          This must be cast with a (PetscObject), for example,
274          PetscObjectRegisterDestroy((PetscObject)mat);
275 
276    Level: developer
277 
278    Notes:
279       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
280     when PETSc ends.
281 
282 .seealso: PetscObjectRegisterDestroyAll()
283 @*/
284 PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
285 {
286   PetscFunctionBegin;
287   PetscValidHeader(obj,1);
288   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
289   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);
290   PetscFunctionReturn(0);
291 }
292 
293 /*@C
294    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
295      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
296 
297    Logically Collective on individual PetscObjects
298 
299    Level: developer
300 
301 .seealso: PetscObjectRegisterDestroy()
302 @*/
303 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
304 {
305   PetscErrorCode ierr;
306   PetscInt       i;
307 
308   PetscFunctionBegin;
309   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
310     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
311   }
312   PetscObjectRegisterDestroy_Count = 0;
313   PetscFunctionReturn(0);
314 }
315 
316 
317 #define MAXREGFIN 256
318 static int PetscRegisterFinalize_Count = 0;
319 static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
320 
321 /*@C
322    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
323 
324    Not Collective
325 
326    Input Parameter:
327 .  PetscErrorCode (*fun)(void) -
328 
329    Level: developer
330 
331    Notes:
332       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
333 
334 .seealso: PetscRegisterFinalizeAll()
335 @*/
336 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
337 {
338   PetscInt i;
339 
340   PetscFunctionBegin;
341   for (i=0; i<PetscRegisterFinalize_Count; i++) {
342     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
343   }
344   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
345   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);
346   PetscFunctionReturn(0);
347 }
348 
349 /*@C
350    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
351 
352    Not Collective unless registered functions are collective
353 
354    Level: developer
355 
356 .seealso: PetscRegisterFinalize()
357 @*/
358 PetscErrorCode  PetscRegisterFinalizeAll(void)
359 {
360   PetscErrorCode ierr;
361   PetscInt       i;
362 
363   PetscFunctionBegin;
364   for (i=0; i<PetscRegisterFinalize_Count; i++) {
365     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
366   }
367   PetscRegisterFinalize_Count = 0;
368   PetscFunctionReturn(0);
369 }
370