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