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