xref: /petsc/src/sys/objects/destroy.c (revision d63b26baa80e193426379c74224b20d1cc985d48)
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 
7e5c89e4eSSatish Balay PetscCookie PETSC_OBJECT_COOKIE = 0;
8e5c89e4eSSatish Balay 
9e5c89e4eSSatish Balay struct _p_Object {
10e5c89e4eSSatish Balay   PETSCHEADER(int);
11e5c89e4eSSatish Balay };
12e5c89e4eSSatish Balay 
13*d63b26baSBarry Smith PetscErrorCode PetscObjectDestroy_PetscObject(PetscObject obj)
14e5c89e4eSSatish Balay {
15*d63b26baSBarry Smith   PetscErrorCode ierr;
16*d63b26baSBarry Smith   PetscFunctionBegin;
17*d63b26baSBarry Smith   PetscValidHeader(obj,1);
18*d63b26baSBarry Smith   if (--obj->refct > 0) PetscFunctionReturn(0);
19*d63b26baSBarry Smith   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
20*d63b26baSBarry 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 
36*d63b26baSBarry Smith    Level: developer
37*d63b26baSBarry Smith 
38*d63b26baSBarry Smith    Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject()
39*d63b26baSBarry 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 {
48e5c89e4eSSatish Balay   PetscObject    o;
49e5c89e4eSSatish Balay   PetscErrorCode ierr;
50e5c89e4eSSatish Balay 
51e5c89e4eSSatish Balay   PetscFunctionBegin;
52e5c89e4eSSatish Balay   PetscValidPointer(obj,2);
53e5c89e4eSSatish Balay 
54e5c89e4eSSatish Balay #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
55e5c89e4eSSatish Balay   ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr);
56e5c89e4eSSatish Balay #endif
57*d63b26baSBarry Smith   ierr = PetscHeaderCreate(o,_p_PetscObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_PetscObject,0);CHKERRQ(ierr);
58e5c89e4eSSatish Balay   /* records not yet defined in PetscObject
59e5c89e4eSSatish Balay   o->data        = 0;
60e5c89e4eSSatish Balay   o->setupcalled = 0;
61e5c89e4eSSatish Balay   */
62e5c89e4eSSatish Balay   *obj = o;
63e5c89e4eSSatish Balay   PetscFunctionReturn(0);
64e5c89e4eSSatish Balay }
65e5c89e4eSSatish Balay 
66e5c89e4eSSatish Balay #undef __FUNCT__
67e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDestroy"
68e30d2299SSatish Balay /*@
69e5c89e4eSSatish Balay    PetscObjectDestroy - Destroys any PetscObject, regardless of the type.
70e5c89e4eSSatish Balay 
71e5c89e4eSSatish Balay    Collective on PetscObject
72e5c89e4eSSatish Balay 
73e5c89e4eSSatish Balay    Input Parameter:
74e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
75e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
76e5c89e4eSSatish Balay          PetscObjectDestroy((PetscObject)mat);
77e5c89e4eSSatish Balay 
78e5c89e4eSSatish Balay    Level: beginner
79e5c89e4eSSatish Balay 
80e5c89e4eSSatish Balay     Concepts: destroying object
81e5c89e4eSSatish Balay     Concepts: freeing object
82e5c89e4eSSatish Balay     Concepts: deleting object
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay @*/
85e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj)
86e5c89e4eSSatish Balay {
87e5c89e4eSSatish Balay   PetscErrorCode ierr;
88e5c89e4eSSatish Balay 
89e5c89e4eSSatish Balay   PetscFunctionBegin;
90e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay   if (obj->bops->destroy) {
93e5c89e4eSSatish Balay     ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr);
94e5c89e4eSSatish Balay   } else {
95e5c89e4eSSatish Balay     SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
96e5c89e4eSSatish Balay   }
97e5c89e4eSSatish Balay   PetscFunctionReturn(0);
98e5c89e4eSSatish Balay }
99e5c89e4eSSatish Balay 
100e5c89e4eSSatish Balay #undef __FUNCT__
101e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectView"
102e5c89e4eSSatish Balay /*@C
103e5c89e4eSSatish Balay    PetscObjectView - Views any PetscObject, regardless of the type.
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay    Collective on PetscObject
106e5c89e4eSSatish Balay 
107e5c89e4eSSatish Balay    Input Parameters:
108e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
109e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
110e5c89e4eSSatish Balay          PetscObjectView((PetscObject)mat,viewer);
111e5c89e4eSSatish Balay -  viewer - any PETSc viewer
112e5c89e4eSSatish Balay 
113e5c89e4eSSatish Balay    Level: intermediate
114e5c89e4eSSatish Balay 
115e5c89e4eSSatish Balay @*/
116e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer)
117e5c89e4eSSatish Balay {
118e5c89e4eSSatish Balay   PetscErrorCode ierr;
119e5c89e4eSSatish Balay 
120e5c89e4eSSatish Balay   PetscFunctionBegin;
121e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
122e5c89e4eSSatish Balay   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(obj->comm);
123e5c89e4eSSatish Balay   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2);
124e5c89e4eSSatish Balay 
125e5c89e4eSSatish Balay   if (obj->bops->view) {
126e5c89e4eSSatish Balay     ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr);
127e5c89e4eSSatish Balay   } else {
128e5c89e4eSSatish Balay     SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
129e5c89e4eSSatish Balay   }
130e5c89e4eSSatish Balay   PetscFunctionReturn(0);
131e5c89e4eSSatish Balay }
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay #undef __FUNCT__
134e5c89e4eSSatish Balay #define __FUNCT__ "PetscTypeCompare"
135e5c89e4eSSatish Balay /*@C
136e5c89e4eSSatish Balay    PetscTypeCompare - Determines whether a PETSc object is of a particular type.
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay    Not Collective
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay    Input Parameters:
141e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP.
142e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
143e5c89e4eSSatish Balay          PetscObjectDestroy((PetscObject)mat);
144e5c89e4eSSatish Balay -  type_name - string containing a type name
145e5c89e4eSSatish Balay 
146e5c89e4eSSatish Balay    Output Parameter:
147e5c89e4eSSatish Balay .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
148e5c89e4eSSatish Balay 
149e5c89e4eSSatish Balay    Level: intermediate
150e5c89e4eSSatish Balay 
151e5c89e4eSSatish Balay .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay    Concepts: comparing^object types
154e5c89e4eSSatish Balay    Concepts: types^comparing
155e5c89e4eSSatish Balay    Concepts: object type^comparing
156e5c89e4eSSatish Balay 
157e5c89e4eSSatish Balay @*/
158e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
159e5c89e4eSSatish Balay {
160e5c89e4eSSatish Balay   PetscErrorCode ierr;
161e5c89e4eSSatish Balay 
162e5c89e4eSSatish Balay   PetscFunctionBegin;
163e5c89e4eSSatish Balay   if (!obj) {
164e5c89e4eSSatish Balay     *same = PETSC_FALSE;
165e5c89e4eSSatish Balay   } else if (!type_name && !obj->type_name) {
166e5c89e4eSSatish Balay     *same = PETSC_TRUE;
167e5c89e4eSSatish Balay   } else if (!type_name || !obj->type_name) {
168e5c89e4eSSatish Balay     *same = PETSC_FALSE;
169e5c89e4eSSatish Balay   } else {
170e5c89e4eSSatish Balay     PetscValidHeader(obj,1);
171e5c89e4eSSatish Balay     PetscValidCharPointer(type_name,2);
172e5c89e4eSSatish Balay     PetscValidPointer(same,3);
173e5c89e4eSSatish Balay     ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr);
174e5c89e4eSSatish Balay   }
175e5c89e4eSSatish Balay   PetscFunctionReturn(0);
176e5c89e4eSSatish Balay }
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay static int         PetscObjectRegisterDestroy_Count = 0;
179e5c89e4eSSatish Balay static PetscObject PetscObjectRegisterDestroy_Objects[256];
180e5c89e4eSSatish Balay 
181e5c89e4eSSatish Balay #undef __FUNCT__
182e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroy"
183e5c89e4eSSatish Balay /*@C
184e5c89e4eSSatish Balay    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
185e5c89e4eSSatish Balay      PetscFinalize() is called.
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay    Collective on PetscObject
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay    Input Parameter:
190e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP.
191e5c89e4eSSatish Balay          This must be cast with a (PetscObject), for example,
192e5c89e4eSSatish Balay          PetscObjectRegisterDestroy((PetscObject)mat);
193e5c89e4eSSatish Balay 
194e5c89e4eSSatish Balay    Level: developer
195e5c89e4eSSatish Balay 
196e5c89e4eSSatish Balay    Notes:
197e5c89e4eSSatish Balay       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
198e5c89e4eSSatish Balay     when PETSc ends.
199e5c89e4eSSatish Balay 
200e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll()
201e5c89e4eSSatish Balay @*/
202e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj)
203e5c89e4eSSatish Balay {
204e5c89e4eSSatish Balay   PetscFunctionBegin;
205e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
206e5c89e4eSSatish Balay   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
207e5c89e4eSSatish Balay   PetscFunctionReturn(0);
208e5c89e4eSSatish Balay }
209e5c89e4eSSatish Balay 
210e5c89e4eSSatish Balay #undef __FUNCT__
211e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroyAll"
212e5c89e4eSSatish Balay /*@C
213e5c89e4eSSatish Balay    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
214e5c89e4eSSatish Balay      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
215e5c89e4eSSatish Balay      PetscFinalize() is called.
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay    Collective on individual PetscObjects
218e5c89e4eSSatish Balay 
219e5c89e4eSSatish Balay    Level: developer
220e5c89e4eSSatish Balay 
221e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy()
222e5c89e4eSSatish Balay @*/
223e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void)
224e5c89e4eSSatish Balay {
225e5c89e4eSSatish Balay   PetscErrorCode ierr;
226e5c89e4eSSatish Balay   int i;
227e5c89e4eSSatish Balay 
228e5c89e4eSSatish Balay   PetscFunctionBegin;
229e5c89e4eSSatish Balay   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
230e5c89e4eSSatish Balay     ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr);
231e5c89e4eSSatish Balay   }
232e5c89e4eSSatish Balay   PetscFunctionReturn(0);
233e5c89e4eSSatish Balay }
234e5c89e4eSSatish Balay 
235e5c89e4eSSatish Balay 
236