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