xref: /petsc/src/sys/objects/destroy.c (revision feff33ee0b5b037fa8f9f294dede656a2f85cc47)
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 /*@C
106    PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
107 
108    Not Collective
109 
110    Input Parameters:
111 +  obj - any PETSc object, for example a Vec, Mat or KSP.
112          This must be cast with a (PetscObject), for example,
113          PetscObjectTypeCompare((PetscObject)mat);
114 -  type_name - string containing a type name
115 
116    Output Parameter:
117 .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
118 
119    Level: intermediate
120 
121 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare()
122 
123    Concepts: comparing^object types
124    Concepts: types^comparing
125    Concepts: object type^comparpeing
126 
127 @*/
128 PetscErrorCode  PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
129 {
130   PetscErrorCode ierr;
131 
132   PetscFunctionBegin;
133   if (!obj) *same = PETSC_FALSE;
134   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
135   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
136   else {
137     PetscValidHeader(obj,1);
138     PetscValidCharPointer(type_name,2);
139     PetscValidPointer(same,3);
140     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
141   }
142   PetscFunctionReturn(0);
143 }
144 
145 /*@C
146    PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
147 
148    Not Collective
149 
150    Input Parameters:
151 +  mat - the matrix
152 -  type_name - string containing a type name
153 
154    Output Parameter:
155 .  same - PETSC_TRUE if it is of the same base type
156 
157    Level: intermediate
158 
159 .seealso: PetscObjectTypeCompare()
160 
161 
162 @*/
163 PetscErrorCode  PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
164 {
165   PetscErrorCode ierr;
166 
167   PetscFunctionBegin;
168   if (!obj) *same = PETSC_FALSE;
169   else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
170   else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
171   else {
172     PetscValidHeader(obj,1);
173     PetscValidCharPointer(type_name,2);
174     PetscValidPointer(same,3);
175     ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
176   }
177   PetscFunctionReturn(0);
178 }
179 
180 /*@C
181    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
182 
183    Not Collective
184 
185    Input Parameters:
186 +  obj - any PETSc object, for example a Vec, Mat or KSP.
187          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
188 -  type_name - string containing a type name, pass the empty string "" to terminate the list
189 
190    Output Parameter:
191 .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
192 
193    Level: intermediate
194 
195 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare()
196 
197    Concepts: comparing^object types
198    Concepts: types^comparing
199    Concepts: object type^comparing
200 
201 @*/
202 PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
203 {
204   PetscErrorCode ierr;
205   va_list        Argp;
206 
207   PetscFunctionBegin;
208   *match = PETSC_FALSE;
209   va_start(Argp,type_name);
210   while (type_name && type_name[0]) {
211     PetscBool found;
212     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
213     if (found) {
214       *match = PETSC_TRUE;
215       break;
216     }
217     type_name = va_arg(Argp,const char*);
218   }
219   va_end(Argp);
220   PetscFunctionReturn(0);
221 }
222 
223 #define MAXREGDESOBJS 256
224 static int         PetscObjectRegisterDestroy_Count = 0;
225 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
226 
227 /*@C
228    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
229      PetscFinalize() is called.
230 
231    Logically Collective on PetscObject
232 
233    Input Parameter:
234 .  obj - any PETSc object, for example a Vec, Mat or KSP.
235          This must be cast with a (PetscObject), for example,
236          PetscObjectRegisterDestroy((PetscObject)mat);
237 
238    Level: developer
239 
240    Notes:
241       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
242     when PETSc ends.
243 
244 .seealso: PetscObjectRegisterDestroyAll()
245 @*/
246 PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
247 {
248   PetscFunctionBegin;
249   PetscValidHeader(obj,1);
250   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
251   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);
252   PetscFunctionReturn(0);
253 }
254 
255 /*@C
256    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
257      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
258 
259    Logically Collective on individual PetscObjects
260 
261    Level: developer
262 
263 .seealso: PetscObjectRegisterDestroy()
264 @*/
265 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
266 {
267   PetscErrorCode ierr;
268   PetscInt       i;
269 
270   PetscFunctionBegin;
271   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
272     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
273   }
274   PetscObjectRegisterDestroy_Count = 0;
275   PetscFunctionReturn(0);
276 }
277 
278 
279 #define MAXREGFIN 256
280 static int PetscRegisterFinalize_Count = 0;
281 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
282 
283 /*@C
284    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
285 
286    Not Collective
287 
288    Input Parameter:
289 .  PetscErrorCode (*fun)(void) -
290 
291    Level: developer
292 
293    Notes:
294       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
295 
296 .seealso: PetscRegisterFinalizeAll()
297 @*/
298 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
299 {
300   PetscInt i;
301 
302   PetscFunctionBegin;
303   for (i=0; i<PetscRegisterFinalize_Count; i++) {
304     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
305   }
306   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
307   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);
308   PetscFunctionReturn(0);
309 }
310 
311 /*@C
312    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
313 
314    Not Collective unless registered functions are collective
315 
316    Level: developer
317 
318 .seealso: PetscRegisterFinalize()
319 @*/
320 PetscErrorCode  PetscRegisterFinalizeAll(void)
321 {
322   PetscErrorCode ierr;
323   PetscInt       i;
324 
325   PetscFunctionBegin;
326   for (i=0; i<PetscRegisterFinalize_Count; i++) {
327     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
328   }
329   PetscRegisterFinalize_Count = 0;
330   PetscFunctionReturn(0);
331 }
332