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: }