Actual source code: destroy.c
petsc-3.11.4 2019-09-28
2: /*
3: Provides utility routines for manulating any type of PETSc object.
4: */
5: #include <petsc/private/petscimpl.h>
6: #include <petscviewer.h>
8: PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj)
9: {
11: PetscInt i;
14: if (obj->intstar_idmax>0) {
15: for (i=0; i<obj->intstar_idmax; i++) {
16: PetscFree(obj->intstarcomposeddata[i]);
17: }
18: PetscFree(obj->intstarcomposeddata);
19: PetscFree(obj->intstarcomposedstate);
20: }
21: if (obj->realstar_idmax>0) {
22: for (i=0; i<obj->realstar_idmax; i++) {
23: PetscFree(obj->realstarcomposeddata[i]);
24: }
25: PetscFree(obj->realstarcomposeddata);
26: PetscFree(obj->realstarcomposedstate);
27: }
28: if (obj->scalarstar_idmax>0) {
29: for (i=0; i<obj->scalarstar_idmax; i++) {
30: PetscFree(obj->scalarstarcomposeddata[i]);
31: }
32: PetscFree(obj->scalarstarcomposeddata);
33: PetscFree(obj->scalarstarcomposedstate);
34: }
35: PetscFree(obj->intcomposeddata);
36: PetscFree(obj->intcomposedstate);
37: PetscFree(obj->realcomposeddata);
38: PetscFree(obj->realcomposedstate);
39: PetscFree(obj->scalarcomposeddata);
40: PetscFree(obj->scalarcomposedstate);
41: return(0);
42: }
44: /*@
45: PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
47: Collective on PetscObject
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);
54: Level: beginner
56: Concepts: destroying object
57: Concepts: freeing object
58: Concepts: deleting object
60: @*/
61: PetscErrorCode PetscObjectDestroy(PetscObject *obj)
62: {
66: if (!*obj) return(0);
68: if (*obj && (*obj)->bops->destroy) {
69: (*(*obj)->bops->destroy)(obj);
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: return(0);
72: }
74: /*@C
75: PetscObjectView - Views any PetscObject, regardless of the type.
77: Collective on PetscObject
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
85: Level: intermediate
87: @*/
88: PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer)
89: {
94: if (!viewer) {
95: PetscViewerASCIIGetStdout(obj->comm,&viewer);
96: }
99: if (obj->bops->view) {
100: (*obj->bops->view)(obj,viewer);
101: } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
102: return(0);
103: }
105: #define CHKERRQI(incall,ierr) if (ierr) {incall = PETSC_FALSE; }
107: /*@C
108: PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed.
110: Collective on PetscObject
112: Input Parameters:
113: + obj - the object
114: . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used)
115: - optionname - option to activate viewing
117: Level: intermediate
119: @*/
120: PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[])
121: {
122: PetscErrorCode ierr;
123: PetscViewer viewer;
124: PetscBool flg;
125: static PetscBool incall = PETSC_FALSE;
126: PetscViewerFormat format;
127: const char *prefix;
130: if (incall) return(0);
131: incall = PETSC_TRUE;
132: prefix = bobj ? bobj->prefix : obj->prefix;
133: PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg);CHKERRQI(incall,ierr);
134: if (flg) {
135: PetscViewerPushFormat(viewer,format);CHKERRQI(incall,ierr);
136: PetscObjectView(obj,viewer);CHKERRQI(incall,ierr);
137: PetscViewerPopFormat(viewer);CHKERRQI(incall,ierr);
138: PetscViewerDestroy(&viewer);CHKERRQI(incall,ierr);
139: }
140: incall = PETSC_FALSE;
141: return(0);
142: }
144: /*@C
145: PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type.
147: Not Collective
149: Input Parameters:
150: + obj - any PETSc object, for example a Vec, Mat or KSP.
151: This must be cast with a (PetscObject), for example,
152: PetscObjectTypeCompare((PetscObject)mat);
153: - type_name - string containing a type name
155: Output Parameter:
156: . same - PETSC_TRUE if they are the same, else PETSC_FALSE
158: Level: intermediate
160: .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny()
162: Concepts: comparing^object types
163: Concepts: types^comparing
164: Concepts: object type^comparpeing
166: @*/
167: PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same)
168: {
172: if (!obj) *same = PETSC_FALSE;
173: else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
174: else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
175: else {
179: PetscStrcmp((char*)(obj->type_name),type_name,same);
180: }
181: return(0);
182: }
184: /*@C
185: PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ
187: Not Collective
189: Input Parameters:
190: + mat - the matrix
191: - type_name - string containing a type name
193: Output Parameter:
194: . same - PETSC_TRUE if it is of the same base type
196: Level: intermediate
198: .seealso: PetscObjectTypeCompare(), PetscObjectTypeCompareAny()
200: @*/
201: PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool *same)
202: {
206: if (!obj) *same = PETSC_FALSE;
207: else if (!type_name && !obj->type_name) *same = PETSC_TRUE;
208: else if (!type_name || !obj->type_name) *same = PETSC_FALSE;
209: else {
213: PetscStrbeginswith((char*)(obj->type_name),type_name,same);
214: }
215: return(0);
216: }
218: /*@C
219: PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types.
221: Not Collective
223: Input Parameters:
224: + obj - any PETSc object, for example a Vec, Mat or KSP.
225: This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...);
226: - type_name - string containing a type name, pass the empty string "" to terminate the list
228: Output Parameter:
229: . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE
231: Level: intermediate
233: .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare()
235: Concepts: comparing^object types
236: Concepts: types^comparing
237: Concepts: object type^comparing
239: @*/
240: PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...)
241: {
243: va_list Argp;
246: *match = PETSC_FALSE;
247: va_start(Argp,type_name);
248: while (type_name && type_name[0]) {
249: PetscBool found;
250: PetscObjectTypeCompare(obj,type_name,&found);
251: if (found) {
252: *match = PETSC_TRUE;
253: break;
254: }
255: type_name = va_arg(Argp,const char*);
256: }
257: va_end(Argp);
258: return(0);
259: }
261: #define MAXREGDESOBJS 256
262: static int PetscObjectRegisterDestroy_Count = 0;
263: static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS];
265: /*@C
266: PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
267: PetscFinalize() is called.
269: Logically Collective on PetscObject
271: Input Parameter:
272: . obj - any PETSc object, for example a Vec, Mat or KSP.
273: This must be cast with a (PetscObject), for example,
274: PetscObjectRegisterDestroy((PetscObject)mat);
276: Level: developer
278: Notes:
279: This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
280: when PETSc ends.
282: .seealso: PetscObjectRegisterDestroyAll()
283: @*/
284: PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj)
285: {
288: if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
289: 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);
290: return(0);
291: }
293: /*@C
294: PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
295: with PetscObjectRegisterDestroy(). Called by PetscFinalize()
297: Logically Collective on individual PetscObjects
299: Level: developer
301: .seealso: PetscObjectRegisterDestroy()
302: @*/
303: PetscErrorCode PetscObjectRegisterDestroyAll(void)
304: {
306: PetscInt i;
309: for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
310: PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);
311: }
312: PetscObjectRegisterDestroy_Count = 0;
313: return(0);
314: }
317: #define MAXREGFIN 256
318: static int PetscRegisterFinalize_Count = 0;
319: static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void);
321: /*@C
322: PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize()
324: Not Collective
326: Input Parameter:
327: . PetscErrorCode (*fun)(void) -
329: Level: developer
331: Notes:
332: This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called
334: .seealso: PetscRegisterFinalizeAll()
335: @*/
336: PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void))
337: {
338: PetscInt i;
341: for (i=0; i<PetscRegisterFinalize_Count; i++) {
342: if (f == PetscRegisterFinalize_Functions[i]) return(0);
343: }
344: if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f;
345: 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);
346: return(0);
347: }
349: /*@C
350: PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize()
352: Not Collective unless registered functions are collective
354: Level: developer
356: .seealso: PetscRegisterFinalize()
357: @*/
358: PetscErrorCode PetscRegisterFinalizeAll(void)
359: {
361: PetscInt i;
364: for (i=0; i<PetscRegisterFinalize_Count; i++) {
365: (*PetscRegisterFinalize_Functions[i])();
366: }
367: PetscRegisterFinalize_Count = 0;
368: return(0);
369: }