xref: /petsc/src/sys/objects/destroy.c (revision a7631e779ee37285eb510131acb81bacea428671)
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()
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    PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
147 
148    Not Collective
149 
150    Input Parameters:
151 +  obj - any PETSc object, for example a Vec, Mat or KSP.
152          This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
153 -  type_name - string containing a type name, pass the empty string "" to terminate the list
154 
155    Output Parameter:
156 .  match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
157 
158    Level: intermediate
159 
160 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare()
161 
162    Concepts: comparing^object types
163    Concepts: types^comparing
164    Concepts: object type^comparing
165 
166 @*/
167 PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
168 {
169   PetscErrorCode ierr;
170   va_list        Argp;
171 
172   PetscFunctionBegin;
173   *match = PETSC_FALSE;
174   va_start(Argp,type_name);
175   while (type_name && type_name[0]) {
176     PetscBool found;
177     ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr);
178     if (found) {
179       *match = PETSC_TRUE;
180       break;
181     }
182     type_name = va_arg(Argp,const char*);
183   }
184   va_end(Argp);
185   PetscFunctionReturn(0);
186 }
187 
188 #define MAXREGDESOBJS 256
189 static int         PetscObjectRegisterDestroy_Count = 0;
190 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
191 
192 /*@C
193    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
194      PetscFinalize() is called.
195 
196    Logically Collective on PetscObject
197 
198    Input Parameter:
199 .  obj - any PETSc object, for example a Vec, Mat or KSP.
200          This must be cast with a (PetscObject), for example,
201          PetscObjectRegisterDestroy((PetscObject)mat);
202 
203    Level: developer
204 
205    Notes:
206       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
207     when PETSc ends.
208 
209 .seealso: PetscObjectRegisterDestroyAll()
210 @*/
211 PetscErrorCode  PetscObjectRegisterDestroy(PetscObject obj)
212 {
213   PetscFunctionBegin;
214   PetscValidHeader(obj,1);
215   if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
216   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);
217   PetscFunctionReturn(0);
218 }
219 
220 /*@C
221    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
222      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
223 
224    Logically Collective on individual PetscObjects
225 
226    Level: developer
227 
228 .seealso: PetscObjectRegisterDestroy()
229 @*/
230 PetscErrorCode  PetscObjectRegisterDestroyAll(void)
231 {
232   PetscErrorCode ierr;
233   PetscInt       i;
234 
235   PetscFunctionBegin;
236   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
237     ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
238   }
239   PetscObjectRegisterDestroy_Count = 0;
240   PetscFunctionReturn(0);
241 }
242 
243 
244 #define MAXREGFIN 256
245 static int PetscRegisterFinalize_Count = 0;
246 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void));
247 
248 /*@C
249    PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
250 
251    Not Collective
252 
253    Input Parameter:
254 .  PetscErrorCode (*fun)(void) -
255 
256    Level: developer
257 
258    Notes:
259       This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
260 
261 .seealso: PetscRegisterFinalizeAll()
262 @*/
263 PetscErrorCode  PetscRegisterFinalize(PetscErrorCode (*f)(void))
264 {
265   PetscInt i;
266 
267   PetscFunctionBegin;
268   for (i=0; i<PetscRegisterFinalize_Count; i++) {
269     if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0);
270   }
271   if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
272   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);
273   PetscFunctionReturn(0);
274 }
275 
276 /*@C
277    PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
278 
279    Not Collective unless registered functions are collective
280 
281    Level: developer
282 
283 .seealso: PetscRegisterFinalize()
284 @*/
285 PetscErrorCode  PetscRegisterFinalizeAll(void)
286 {
287   PetscErrorCode ierr;
288   PetscInt       i;
289 
290   PetscFunctionBegin;
291   for (i=0; i<PetscRegisterFinalize_Count; i++) {
292     ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr);
293   }
294   PetscRegisterFinalize_Count = 0;
295   PetscFunctionReturn(0);
296 }
297