Actual source code: destroy.c
1: #define PETSC_DLL
2: /*
3: Provides utility routines for manulating any type of PETSc object.
4: */
5: #include petsc.h
7: struct _p_Object {
8: PETSCHEADER(int);
9: };
11: PetscErrorCode PetscObjectDestroy_PetscObject(PetscObject obj)
12: {
16: if (--obj->refct > 0) return(0);
17: PetscHeaderDestroy(obj);
18: return(0);
19: }
23: /*@C
24: PetscObjectCreate - Creates a PetscObject
26: Collective on PetscObject
28: Input Parameter:
29: . comm - An MPI communicator
31: Output Parameter:
32: . obj - The object
34: Level: developer
36: Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject()
37: to make new object classes.
39: Concepts: destroying object
40: Concepts: freeing object
41: Concepts: deleting object
43: @*/
44: PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm comm, PetscObject *obj)
45: {
46: PetscObject o;
52: #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
53: PetscInitializePackage(PETSC_NULL);
54: #endif
55: PetscHeaderCreate(o,_p_PetscObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_PetscObject,0);
56: /* records not yet defined in PetscObject
57: o->data = 0;
58: o->setupcalled = 0;
59: */
60: *obj = o;
61: return(0);
62: }
66: /*@
67: PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
69: Collective on PetscObject
71: Input Parameter:
72: . obj - any PETSc object, for example a Vec, Mat or KSP.
73: This must be cast with a (PetscObject), for example,
74: PetscObjectDestroy((PetscObject)mat);
76: Level: beginner
78: Concepts: destroying object
79: Concepts: freeing object
80: Concepts: deleting object
82: @*/
83: PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj)
84: {
90: if (obj->bops->destroy) {
91: (*obj->bops->destroy)(obj);
92: } else {
93: SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
94: }
95: return(0);
96: }
100: /*@C
101: PetscObjectView - Views any PetscObject, regardless of the type.
103: Collective on PetscObject
105: Input Parameters:
106: + obj - any PETSc object, for example a Vec, Mat or KSP.
107: This must be cast with a (PetscObject), for example,
108: PetscObjectView((PetscObject)mat,viewer);
109: - viewer - any PETSc viewer
111: Level: intermediate
113: @*/
114: PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer)
115: {
120: if (!viewer) viewer = PETSC_VIEWER_STDOUT_(obj->comm);
123: if (obj->bops->view) {
124: (*obj->bops->view)(obj,viewer);
125: } else {
126: SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
127: }
128: return(0);
129: }
133: /*@C
134: PetscTypeCompare - Determines whether a PETSc object is of a particular type.
136: Not Collective
138: Input Parameters:
139: + obj - any PETSc object, for example a Vec, Mat or KSP.
140: This must be cast with a (PetscObject), for example,
141: PetscObjectDestroy((PetscObject)mat);
142: - type_name - string containing a type name
144: Output Parameter:
145: . same - PETSC_TRUE if they are the same, else PETSC_FALSE
146:
147: Level: intermediate
149: .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
151: Concepts: comparing^object types
152: Concepts: types^comparing
153: Concepts: object type^comparing
155: @*/
156: PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
157: {
161: if (!obj) {
162: *same = PETSC_FALSE;
163: } else if (!type_name && !obj->type_name) {
164: *same = PETSC_TRUE;
165: } else if (!type_name || !obj->type_name) {
166: *same = PETSC_FALSE;
167: } else {
171: PetscStrcmp((char*)(obj->type_name),type_name,same);
172: }
173: return(0);
174: }
176: static int PetscObjectRegisterDestroy_Count = 0;
177: static PetscObject PetscObjectRegisterDestroy_Objects[256];
181: /*@C
182: PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
183: PetscFinalize() is called.
185: Collective on PetscObject
187: Input Parameter:
188: . obj - any PETSc object, for example a Vec, Mat or KSP.
189: This must be cast with a (PetscObject), for example,
190: PetscObjectRegisterDestroy((PetscObject)mat);
192: Level: developer
194: Notes:
195: This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
196: when PETSc ends.
198: .seealso: PetscObjectRegisterDestroyAll()
199: @*/
200: PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj)
201: {
204: PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
205: return(0);
206: }
210: /*@C
211: PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
212: with PetscObjectRegisterDestroy(). Called by PetscFinalize()
213: PetscFinalize() is called.
215: Collective on individual PetscObjects
217: Level: developer
219: .seealso: PetscObjectRegisterDestroy()
220: @*/
221: PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void)
222: {
224: int i;
227: for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
228: PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);
229: }
230: return(0);
231: }