xref: /petsc/src/sys/objects/destroy.c (revision 472b90b31164cc703617d91241830c7f211772fc)
1 
2 /*
3      Provides utility routines for manulating any type of PETSc object.
4 */
5 #include <petscsys.h>  /*I   "petscsys.h"    I*/
6 
7 
8 #undef __FUNCT__
9 #define __FUNCT__ "PetscComposedQuantitiesDestroy"
10 PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
11 {
12   PetscErrorCode ierr;
13   PetscInt       i;
14 
15   PetscFunctionBegin;
16   if (obj->intstar_idmax>0) {
17     for (i=0; i<obj->intstar_idmax; i++) {
18       ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr);
19     }
20     ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr);
21     ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr);
22   }
23   if (obj->realstar_idmax>0) {
24     for (i=0; i<obj->realstar_idmax; i++) {
25       ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr);
26     }
27     ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr);
28     ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr);
29   }
30   if (obj->scalarstar_idmax>0) {
31     for (i=0; i<obj->scalarstar_idmax; i++) {
32       ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr);
33     }
34     ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr);
35     ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr);
36   }
37   ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr);
38   ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr);
39   ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr);
40   ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr);
41   ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr);
42   ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr);
43   PetscFunctionReturn(0);
44 }
45 
46 #undef __FUNCT__
47 #define __FUNCT__ "PetscObjectDestroy"
48 /*@
49    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
50 
51    Collective on PetscObject
52 
53    Input Parameter:
54 .  obj - any PETSc object, for example a Vec, Mat or KSP.
55          This must be cast with a (PetscObject*), for example,
56          PetscObjectDestroy((PetscObject*)&mat);
57 
58    Level: beginner
59 
60     Concepts: destroying object
61     Concepts: freeing object
62     Concepts: deleting object
63 
64 @*/
65 PetscErrorCode  PetscObjectDestroy(PetscObject *obj)
66 {
67   PetscErrorCode ierr;
68 
69   PetscFunctionBegin;
70   if (!*obj) PetscFunctionReturn(0);
71   PetscValidHeader(*obj,1);
72   if (*obj && (*obj)->bops->destroy) {
73     ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr);
74   } 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);
75   PetscFunctionReturn(0);
76 }
77 
78 #undef __FUNCT__
79 #define __FUNCT__ "PetscObjectView"
80 /*@C
81    PetscObjectView - Views any PetscObject, regardless of the type.
82 
83    Collective on PetscObject
84 
85    Input Parameters:
86 +  obj - any PETSc object, for example a Vec, Mat or KSP.
87          This must be cast with a (PetscObject), for example,
88          PetscObjectView((PetscObject)mat,viewer);
89 -  viewer - any PETSc viewer
90 
91    Level: intermediate
92 
93 @*/
94 PetscErrorCode  PetscObjectView(PetscObject obj,PetscViewer viewer)
95 {
96   PetscErrorCode ierr;
97 
98   PetscFunctionBegin;
99   PetscValidHeader(obj,1);
100   if (!viewer) {
101     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
102   }
103   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
104 
105   if (obj->bops->view) {
106     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
107   } else {
108     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
109   }
110   PetscFunctionReturn(0);
111 }
112 
113 #undef __FUNCT__
114 #define __FUNCT__ "PetscTypeCompare"
115 /*@C
116    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
117 
118    Not Collective
119 
120    Input Parameters:
121 +  obj - any PETSc object, for example a Vec, Mat or KSP.
122          This must be cast with a (PetscObject), for example,
123          PetscTypeCompare((PetscObject)mat);
124 -  type_name - string containing a type name
125 
126    Output Parameter:
127 .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
128 
129    Level: intermediate
130 
131 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
132 
133    Concepts: comparing^object types
134    Concepts: types^comparing
135    Concepts: object type^comparing
136 
137 @*/
138 PetscErrorCode  PetscTypeCompare(PetscObject obj,const char type_name[],PetscBool  *same)
139 {
140   PetscErrorCode ierr;
141 
142   PetscFunctionBegin;
143   if (!obj) {
144     *same = PETSC_FALSE;
145   } else if (!type_name && !obj->type_name) {
146     *same = PETSC_TRUE;
147   } else if (!type_name || !obj->type_name) {
148     *same = PETSC_FALSE;
149   } else {
150     PetscValidHeader(obj,1);
151     PetscValidCharPointer(type_name,2);
152     PetscValidPointer(same,3);
153     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
154   }
155   PetscFunctionReturn(0);
156 }
157 
158 #undef __FUNCT__
159 #define __FUNCT__ "PetscTypeCompareAny"
160 /*@C
161    PetscTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
162 
163    Not Collective
164 
165    Input Parameters:
166 +  obj - any PETSc object, for example a Vec, Mat or KSP.
167          This must be cast with a (PetscObject), for example, PetscTypeCompareAny((PetscObject)mat,...);
168 -  type_name - string containing a type name, pass the empty string "" to terminate the list
169 
170    Output Parameter:
171 .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
172 
173    Level: intermediate
174 
175 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscTypeCompare()
176 
177    Concepts: comparing^object types
178    Concepts: types^comparing
179    Concepts: object type^comparing
180 
181 @*/
182 PetscErrorCode PetscTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
183 {
184   PetscErrorCode ierr;
185   va_list Argp;
186 
187   PetscFunctionBegin;
188   *match = PETSC_FALSE;
189   va_start(Argp,type_name);
190   while (type_name && type_name[0]) {
191     PetscBool found;
192     ierr = PetscTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
193     if (found) {
194       *match = PETSC_TRUE;
195       break;
196     }
197     type_name = va_arg(Argp,const char*);
198   }
199   va_end(Argp);
200   PetscFunctionReturn(0);
201 }
202 
203 #define MAXREGDESOBJS 256
204 static int         PetscObjectRegisterDestroy_Count = 0;
205 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
206 
207 #undef __FUNCT__
208 #define __FUNCT__ "PetscObjectRegisterDestroy"
209 /*@C
210    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
211      PetscFinalize() is called.
212 
213    Logically Collective on PetscObject
214 
215    Input Parameter:
216 .  obj - any PETSc object, for example a Vec, Mat or KSP.
217          This must be cast with a (PetscObject), for example,
218          PetscObjectRegisterDestroy((PetscObject)mat);
219 
220    Level: developer
221 
222    Notes:
223       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
224     when PETSc ends.
225 
226 .seealso: PetscObjectRegisterDestroyAll()
227 @*/
228 PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
229 {
230   PetscFunctionBegin;
231   PetscValidHeader(obj,1);
232   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) {
233     PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
234   } 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);
235   PetscFunctionReturn(0);
236 }
237 
238 #undef __FUNCT__
239 #define __FUNCT__ "PetscObjectRegisterDestroyAll"
240 /*@C
241    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
242      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
243 
244    Logically Collective on individual PetscObjects
245 
246    Level: developer
247 
248 .seealso: PetscObjectRegisterDestroy()
249 @*/
250 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
251 {
252   PetscErrorCode ierr;
253   PetscInt       i;
254 
255   PetscFunctionBegin;
256   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
257     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
258   }
259   PetscObjectRegisterDestroy_Count = 0;
260   PetscFunctionReturn(0);
261 }
262 
263 
264 #define MAXREGFIN 256
265 static int         PetscRegisterFinalize_Count = 0;
266 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
267 
268 #undef __FUNCT__
269 #define __FUNCT__ "PetscRegisterFinalize"
270 /*@C
271    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
272 
273    Not Collective
274 
275    Input Parameter:
276 .  PetscErrorCode (*fun)(void) -
277 
278    Level: developer
279 
280    Notes:
281       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
282 
283 .seealso: PetscRegisterFinalizeAll()
284 @*/
285 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
286 {
287   PetscFunctionBegin;
288 
289   if (PetscRegisterFinalize_Count < MAXREGFIN) {
290     PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
291   } 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);
292   PetscFunctionReturn(0);
293 }
294 
295 #undef __FUNCT__
296 #define __FUNCT__ "PetscRegisterFinalizeAll"
297 /*@C
298    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
299 
300    Not Collective unless registered functions are collective
301 
302    Level: developer
303 
304 .seealso: PetscRegisterFinalize()
305 @*/
306 PetscErrorCode  PetscRegisterFinalizeAll(void)
307 {
308   PetscErrorCode ierr;
309   PetscInt       i;
310 
311   PetscFunctionBegin;
312   for (i=0; i<PetscRegisterFinalize_Count; i++) {
313     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
314   }
315   PetscRegisterFinalize_Count = 0;
316   PetscFunctionReturn(0);
317 }
318