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: PetscCookie PETSC_OBJECT_COOKIE = 0;

  9: struct _p_Object {
 10:   PETSCHEADER(int);
 11: };

 13: PetscErrorCode PetscObjectDestroy_Private(PetscObject obj)
 14: {
 15:   return 0;
 16: }

 20: /*@C
 21:    PetscObjectCreate - Creates a PetscObject

 23:    Collective on PetscObject

 25:    Input Parameter:
 26: .  comm - An MPI communicator

 28:    Output Parameter:
 29: .  obj - The object

 31:    Level: beginner

 33:     Concepts: destroying object
 34:     Concepts: freeing object
 35:     Concepts: deleting object

 37: @*/
 38: PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm comm, PetscObject *obj)
 39: {
 40:   PetscObject    o;


 46: #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
 47:   PetscInitializePackage(PETSC_NULL);
 48: #endif
 49:   PetscHeaderCreate(o,_p_PetscObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_Private,0);
 50:   /* records not yet defined in PetscObject 
 51:   o->data        = 0;
 52:   o->setupcalled = 0;
 53:   */
 54:   *obj = o;
 55:   return(0);
 56: }

 60: /*@C
 61:    PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 

 63:    Collective on PetscObject

 65:    Input Parameter:
 66: .  obj - any PETSc object, for example a Vec, Mat or KSP.
 67:          This must be cast with a (PetscObject), for example, 
 68:          PetscObjectDestroy((PetscObject)mat);

 70:    Level: beginner

 72:     Concepts: destroying object
 73:     Concepts: freeing object
 74:     Concepts: deleting object

 76: @*/
 77: PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj)
 78: {


 84:   if (obj->bops->destroy) {
 85:     (*obj->bops->destroy)(obj);
 86:   } else {
 87:     SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
 88:   }
 89:   return(0);
 90: }

 94: /*@C
 95:    PetscObjectView - Views any PetscObject, regardless of the type. 

 97:    Collective on PetscObject

 99:    Input Parameters:
100: +  obj - any PETSc object, for example a Vec, Mat or KSP.
101:          This must be cast with a (PetscObject), for example, 
102:          PetscObjectView((PetscObject)mat,viewer);
103: -  viewer - any PETSc viewer

105:    Level: intermediate

107: @*/
108: PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer)
109: {

114:   if (!viewer) viewer = PETSC_VIEWER_STDOUT_(obj->comm);

117:   if (obj->bops->view) {
118:     (*obj->bops->view)(obj,viewer);
119:   } else {
120:     SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
121:   }
122:   return(0);
123: }

127: /*@C
128:    PetscTypeCompare - Determines whether a PETSc object is of a particular type.

130:    Not Collective

132:    Input Parameters:
133: +  obj - any PETSc object, for example a Vec, Mat or KSP.
134:          This must be cast with a (PetscObject), for example, 
135:          PetscObjectDestroy((PetscObject)mat);
136: -  type_name - string containing a type name

138:    Output Parameter:
139: .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
140:   
141:    Level: intermediate

143: .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType()

145:    Concepts: comparing^object types
146:    Concepts: types^comparing
147:    Concepts: object type^comparing

149: @*/
150: PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
151: {

155:   if (!obj) {
156:     *same = PETSC_FALSE;
157:   } else if (!type_name && !obj->type_name) {
158:     *same = PETSC_TRUE;
159:   } else if (!type_name || !obj->type_name) {
160:     *same = PETSC_FALSE;
161:   } else {
165:     PetscStrcmp((char*)(obj->type_name),type_name,same);
166:   }
167:   return(0);
168: }

170: static int         PetscObjectRegisterDestroy_Count = 0;
171: static PetscObject PetscObjectRegisterDestroy_Objects[256];

175: /*@C
176:    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
177:      PetscFinalize() is called.

179:    Collective on PetscObject

181:    Input Parameter:
182: .  obj - any PETSc object, for example a Vec, Mat or KSP.
183:          This must be cast with a (PetscObject), for example, 
184:          PetscObjectRegisterDestroy((PetscObject)mat);

186:    Level: developer

188:    Notes:
189:       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
190:     when PETSc ends.

192: .seealso: PetscObjectRegisterDestroyAll()
193: @*/
194: PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj)
195: {
198:   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
199:   return(0);
200: }

204: /*@C
205:    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
206:      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
207:      PetscFinalize() is called.

209:    Collective on individual PetscObjects

211:    Level: developer

213: .seealso: PetscObjectRegisterDestroy()
214: @*/
215: PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void)
216: {
218:   int i;

221:   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
222:     PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);
223:   }
224:   return(0);
225: }