Actual source code: destroy.c

  1: /*
  2:      Provides utility routines for manulating any type of PETSc object.
  3: */
 4:  #include petsc.h

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

 11:    Collective on PetscObject

 13:    Input Parameter:
 14: .  obj - any PETSc object, for example a Vec, Mat or KSP.
 15:          This must be cast with a (PetscObject), for example, 
 16:          PetscObjectDestroy((PetscObject)mat);

 18:    Level: intermediate

 20:     Concepts: destroying object
 21:     Concepts: freeing object
 22:     Concepts: deleting object

 24: @*/
 25: PetscErrorCode PetscObjectDestroy(PetscObject obj)
 26: {


 32:   if (obj->bops->destroy) {
 33:     (*obj->bops->destroy)(obj);
 34:   } else {
 35:     SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name);
 36:   }
 37:   return(0);
 38: }

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

 45:    Collective on PetscObject

 47:    Input Parameters:
 48: +  obj - any PETSc object, for example a Vec, Mat or KSP.
 49:          This must be cast with a (PetscObject), for example, 
 50:          PetscObjectView((PetscObject)mat,viewer);
 51: -  viewer - any PETSc viewer

 53:    Level: intermediate

 55: @*/
 56: PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer)
 57: {

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

 65:   if (obj->bops->view) {
 66:     (*obj->bops->view)(obj,viewer);
 67:   } else {
 68:     SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine");
 69:   }
 70:   return(0);
 71: }

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

 78:    Not Collective

 80:    Input Parameters:
 81: +  obj - any PETSc object, for example a Vec, Mat or KSP.
 82:          This must be cast with a (PetscObject), for example, 
 83:          PetscObjectDestroy((PetscObject)mat);
 84: -  type_name - string containing a type name

 86:    Output Parameter:
 87: .  same - PETSC_TRUE if they are the same, else PETSC_FALSE
 88:   
 89:    Level: intermediate

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

 93:    Concepts: comparing^object types
 94:    Concepts: types^comparing
 95:    Concepts: object type^comparing

 97: @*/
 98: PetscErrorCode PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same)
 99: {

103:   if (!obj) {
104:     *same = PETSC_FALSE;
105:   } else if (!type_name && !obj->type_name) {
106:     *same = PETSC_TRUE;
107:   } else if (!type_name || !obj->type_name) {
108:     *same = PETSC_FALSE;
109:   } else {
113:     PetscStrcmp((char*)(obj->type_name),type_name,same);
114:   }
115:   return(0);
116: }

118: static int         PetscObjectRegisterDestroy_Count = 0;
119: static PetscObject PetscObjectRegisterDestroy_Objects[256];

123: /*@C
124:    PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when
125:      PetscFinalize() is called.

127:    Collective on PetscObject

129:    Input Parameter:
130: .  obj - any PETSc object, for example a Vec, Mat or KSP.
131:          This must be cast with a (PetscObject), for example, 
132:          PetscObjectRegisterDestroy((PetscObject)mat);

134:    Level: developer

136:    Notes:
137:       This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer
138:     when PETSc ends.

140: .seealso: PetscObjectRegisterDestroyAll()
141: @*/
142: PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj)
143: {
146:   PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj;
147:   return(0);
148: }

152: /*@C
153:    PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered
154:      with PetscObjectRegisterDestroy(). Called by PetscFinalize()
155:      PetscFinalize() is called.

157:    Collective on individual PetscObjects

159:    Level: developer

161: .seealso: PetscObjectRegisterDestroy()
162: @*/
163: PetscErrorCode PetscObjectRegisterDestroyAll(void)
164: {
166:   int i;

169:   for (i=0; i<PetscObjectRegisterDestroy_Count; i++) {
170:     PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);
171:   }
172:   return(0);
173: }