Actual source code: destroy.c
1: /*
2: Provides utility routines for manulating any type of PETSc object.
3: */
4: #include petsc.h
8: /*@C
9: PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
11: Collective on PetscObject
13: Input Parameter:
14: . obj - any PETSc object, for example a Vec, Mat or KSP.
15: This must be cast with a (PetscObject), for example,
16: PetscObjectDestroy((PetscObject)mat);
18: Level: intermediate
20: Concepts: destroying object
21: Concepts: freeing object
22: Concepts: deleting object
24: @*/
25: PetscErrorCode PetscObjectDestroy(PetscObject obj)
26: {
32: if (obj->bops->destroy) {
33: (*obj->bops->destroy)(obj);
34: } else {
35: SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
36: }
37: return(0);
38: }
42: /*@C
43: PetscObjectView - Views any PetscObject, regardless of the type.
45: Collective on PetscObject
47: Input Parameters:
48: + obj - any PETSc object, for example a Vec, Mat or KSP.
49: This must be cast with a (PetscObject), for example,
50: PetscObjectView((PetscObject)mat,viewer);
51: - viewer - any PETSc viewer
53: Level: intermediate
55: @*/
56: PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer)
57: {
62: if (!viewer) viewer = PETSC_VIEWER_STDOUT_(obj->comm);
65: if (obj->bops->view) {
66: (*obj->bops->view)(obj,viewer);
67: } else {
68: SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
69: }
70: return(0);
71: }
75: /*@C
76: PetscTypeCompare - Determines whether a PETSc object is of a particular type.
78: Not Collective
80: Input Parameters:
81: + obj - any PETSc object, for example a Vec, Mat or KSP.
82: This must be cast with a (PetscObject), for example,
83: PetscObjectDestroy((PetscObject)mat);
84: - type_name - string containing a type name
86: Output Parameter:
87: . same - PETSC_TRUE if they are the same, else PETSC_FALSE
88:
89: Level: intermediate
91: .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
93: Concepts: comparing^object types
94: Concepts: types^comparing
95: Concepts: object type^comparing
97: @*/
98: PetscErrorCode PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
99: {
103: if (!obj) {
104: *same = PETSC_FALSE;
105: } else if (!type_name && !obj->type_name) {
106: *same = PETSC_TRUE;
107: } else if (!type_name || !obj->type_name) {
108: *same = PETSC_FALSE;
109: } else {
113: PetscStrcmp((char*)(obj->type_name),type_name,same);
114: }
115: return(0);
116: }
118: static int PetscObjectRegisterDestroy_Count = 0;
119: static PetscObject PetscObjectRegisterDestroy_Objects[256];
123: /*@C
124: PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
125: PetscFinalize() is called.
127: Collective on PetscObject
129: Input Parameter:
130: . obj - any PETSc object, for example a Vec, Mat or KSP.
131: This must be cast with a (PetscObject), for example,
132: PetscObjectRegisterDestroy((PetscObject)mat);
134: Level: developer
136: Notes:
137: This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
138: when PETSc ends.
140: .seealso: PetscObjectRegisterDestroyAll()
141: @*/
142: PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj)
143: {
146: PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
147: return(0);
148: }
152: /*@C
153: PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
154: with PetscObjectRegisterDestroy(). Called by PetscFinalize()
155: PetscFinalize() is called.
157: Collective on individual PetscObjects
159: Level: developer
161: .seealso: PetscObjectRegisterDestroy()
162: @*/
163: PetscErrorCode PetscObjectRegisterDestroyAll(void)
164: {
166: int i;
169: for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
170: PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);
171: }
172: return(0);
173: }