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