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