xref: /petsc/src/sys/objects/destroy.c (revision 3050cee28ff83b093d983d7c5197e87b438ca09b)
1 #define PETSC_DLL
2 /*
3      Provides utility routines for manulating any type of PETSc object.
4 */
5 #include "petsc.h"  /*I   "petsc.h"    I*/
6 
7 struct _p_Object {
8   PETSCHEADER(int);
9 };
10 
11 PetscErrorCode PetscObjectDestroy_PetscObject(PetscObject obj)
12 {
13   PetscErrorCode ierr;
14   PetscFunctionBegin;
15   PetscValidHeader(obj,1);
16   if (--obj->refct > 0) PetscFunctionReturn(0);
17   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
18   PetscFunctionReturn(0);
19 }
20 
21 #undef __FUNCT__
22 #define __FUNCT__ "PetscObjectCreate"
23 /*@C
24    PetscObjectCreate - Creates a PetscObject
25 
26    Collective on PetscObject
27 
28    Input Parameter:
29 .  comm - An MPI communicator
30 
31    Output Parameter:
32 .  obj - The object
33 
34    Level: developer
35 
36    Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject()
37           to make new object classes.
38 
39     Concepts: destroying object
40     Concepts: freeing object
41     Concepts: deleting object
42 
43 @*/
44 PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm comm, PetscObject *obj)
45 {
46   PetscObject    o;
47   PetscErrorCode ierr;
48 
49   PetscFunctionBegin;
50   PetscValidPointer(obj,2);
51 
52 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
53   ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr);
54 #endif
55   ierr = PetscHeaderCreate(o,_p_PetscObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_PetscObject,0);CHKERRQ(ierr);
56   /* records not yet defined in PetscObject
57   o->data        = 0;
58   o->setupcalled = 0;
59   */
60   *obj = o;
61   PetscFunctionReturn(0);
62 }
63 
64 #undef __FUNCT__
65 #define __FUNCT__ "PetscObjectCreateGeneric"
66 /*@C
67    PetscObjectCreateGeneric - Creates a PetscObject
68 
69    Collective on PetscObject
70 
71    Input Parameter:
72 +  comm - An MPI communicator
73 .  cookie - The class cookie
74 -  name - The class name
75 
76    Output Parameter:
77 .  obj - The object
78 
79    Level: developer
80 
81    Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject()
82           to make new object classes.
83 
84     Concepts: destroying object
85     Concepts: freeing object
86     Concepts: deleting object
87 
88 @*/
89 PetscErrorCode PETSC_DLLEXPORT PetscObjectCreateGeneric(MPI_Comm comm, PetscCookie cookie, const char name[], PetscObject *obj)
90 {
91   PetscObject    o;
92   PetscErrorCode ierr;
93 
94   PetscFunctionBegin;
95   PetscValidPointer(obj,2);
96 
97 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
98   ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr);
99 #endif
100   ierr = PetscHeaderCreate(o,_p_PetscObject,-1,cookie,0,name,comm,PetscObjectDestroy_PetscObject,0);CHKERRQ(ierr);
101   /* records not yet defined in PetscObject
102   o->data        = 0;
103   o->setupcalled = 0;
104   */
105   *obj = o;
106   PetscFunctionReturn(0);
107 }
108 
109 #undef __FUNCT__
110 #define __FUNCT__ "PetscObjectDestroy"
111 /*@
112    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
113 
114    Collective on PetscObject
115 
116    Input Parameter:
117 .  obj - any PETSc object, for example a Vec, Mat or KSP.
118          This must be cast with a (PetscObject), for example,
119          PetscObjectDestroy((PetscObject)mat);
120 
121    Level: beginner
122 
123     Concepts: destroying object
124     Concepts: freeing object
125     Concepts: deleting object
126 
127 @*/
128 PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj)
129 {
130   PetscErrorCode ierr;
131 
132   PetscFunctionBegin;
133   PetscValidHeader(obj,1);
134 
135   if (obj->bops->destroy) {
136     ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr);
137   } else {
138     SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
139   }
140   PetscFunctionReturn(0);
141 }
142 
143 #undef __FUNCT__
144 #define __FUNCT__ "PetscObjectView"
145 /*@C
146    PetscObjectView - Views any PetscObject, regardless of the type.
147 
148    Collective on PetscObject
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,
153          PetscObjectView((PetscObject)mat,viewer);
154 -  viewer - any PETSc viewer
155 
156    Level: intermediate
157 
158 @*/
159 PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer)
160 {
161   PetscErrorCode ierr;
162 
163   PetscFunctionBegin;
164   PetscValidHeader(obj,1);
165   if (!viewer) {
166     ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr);
167   }
168   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2);
169 
170   if (obj->bops->view) {
171     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
172   } else {
173     SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
174   }
175   PetscFunctionReturn(0);
176 }
177 
178 #undef __FUNCT__
179 #define __FUNCT__ "PetscTypeCompare"
180 /*@C
181    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
182 
183    Not Collective
184 
185    Input Parameters:
186 +  obj - any PETSc object, for example a Vec, Mat or KSP.
187          This must be cast with a (PetscObject), for example,
188          PetscObjectDestroy((PetscObject)mat);
189 -  type_name - string containing a type name
190 
191    Output Parameter:
192 .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
193 
194    Level: intermediate
195 
196 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
197 
198    Concepts: comparing^object types
199    Concepts: types^comparing
200    Concepts: object type^comparing
201 
202 @*/
203 PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
204 {
205   PetscErrorCode ierr;
206 
207   PetscFunctionBegin;
208   if (!obj) {
209     *same = PETSC_FALSE;
210   } else if (!type_name && !obj->type_name) {
211     *same = PETSC_TRUE;
212   } else if (!type_name || !obj->type_name) {
213     *same = PETSC_FALSE;
214   } else {
215     PetscValidHeader(obj,1);
216     PetscValidCharPointer(type_name,2);
217     PetscValidPointer(same,3);
218     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
219   }
220   PetscFunctionReturn(0);
221 }
222 
223 static int         PetscObjectRegisterDestroy_Count = 0;
224 static PetscObject PetscObjectRegisterDestroy_Objects[256];
225 
226 #undef __FUNCT__
227 #define __FUNCT__ "PetscObjectRegisterDestroy"
228 /*@C
229    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
230      PetscFinalize() is called.
231 
232    Collective on PetscObject
233 
234    Input Parameter:
235 .  obj - any PETSc object, for example a Vec, Mat or KSP.
236          This must be cast with a (PetscObject), for example,
237          PetscObjectRegisterDestroy((PetscObject)mat);
238 
239    Level: developer
240 
241    Notes:
242       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
243     when PETSc ends.
244 
245 .seealso: PetscObjectRegisterDestroyAll()
246 @*/
247 PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj)
248 {
249   PetscFunctionBegin;
250   PetscValidHeader(obj,1);
251   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
252   PetscFunctionReturn(0);
253 }
254 
255 #undef __FUNCT__
256 #define __FUNCT__ "PetscObjectRegisterDestroyAll"
257 /*@C
258    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
259      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
260      PetscFinalize() is called.
261 
262    Collective on individual PetscObjects
263 
264    Level: developer
265 
266 .seealso: PetscObjectRegisterDestroy()
267 @*/
268 PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void)
269 {
270   PetscErrorCode ierr;
271   int i;
272 
273   PetscFunctionBegin;
274   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
275     ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
276   }
277   PetscFunctionReturn(0);
278 }
279 
280 
281