1 2 /* 3 Provides utility routines for manulating any type of PETSc object. 4 */ 5 #include <petscsys.h> /*I "petscsys.h" I*/ 6 7 8 #undef __FUNCT__ 9 #define __FUNCT__ "PetscComposedQuantitiesDestroy" 10 PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj) 11 { 12 PetscErrorCode ierr; 13 PetscInt i; 14 15 PetscFunctionBegin; 16 if (obj->intstar_idmax>0) { 17 for (i=0; i<obj->intstar_idmax; i++) { 18 ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr); 19 } 20 ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr); 21 ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr); 22 } 23 if (obj->realstar_idmax>0) { 24 for (i=0; i<obj->realstar_idmax; i++) { 25 ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr); 26 } 27 ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr); 28 ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr); 29 } 30 if (obj->scalarstar_idmax>0) { 31 for (i=0; i<obj->scalarstar_idmax; i++) { 32 ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr); 33 } 34 ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr); 35 ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr); 36 } 37 ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr); 38 ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr); 39 ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr); 40 ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr); 41 ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr); 42 ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr); 43 PetscFunctionReturn(0); 44 } 45 46 #undef __FUNCT__ 47 #define __FUNCT__ "PetscObjectDestroy" 48 /*@ 49 PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 50 51 Collective on PetscObject 52 53 Input Parameter: 54 . obj - any PETSc object, for example a Vec, Mat or KSP. 55 This must be cast with a (PetscObject*), for example, 56 PetscObjectDestroy((PetscObject*)&mat); 57 58 Level: beginner 59 60 Concepts: destroying object 61 Concepts: freeing object 62 Concepts: deleting object 63 64 @*/ 65 PetscErrorCode PetscObjectDestroy(PetscObject *obj) 66 { 67 PetscErrorCode ierr; 68 69 PetscFunctionBegin; 70 if (!*obj) PetscFunctionReturn(0); 71 PetscValidHeader(*obj,1); 72 if (*obj && (*obj)->bops->destroy) { 73 ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr); 74 } else if (*obj) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",(*obj)->class_name); 75 PetscFunctionReturn(0); 76 } 77 78 #undef __FUNCT__ 79 #define __FUNCT__ "PetscObjectView" 80 /*@C 81 PetscObjectView - Views any PetscObject, regardless of the type. 82 83 Collective on PetscObject 84 85 Input Parameters: 86 + obj - any PETSc object, for example a Vec, Mat or KSP. 87 This must be cast with a (PetscObject), for example, 88 PetscObjectView((PetscObject)mat,viewer); 89 - viewer - any PETSc viewer 90 91 Level: intermediate 92 93 @*/ 94 PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 95 { 96 PetscErrorCode ierr; 97 98 PetscFunctionBegin; 99 PetscValidHeader(obj,1); 100 if (!viewer) { 101 ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 102 } 103 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 104 105 if (obj->bops->view) { 106 ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 107 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 108 PetscFunctionReturn(0); 109 } 110 111 #undef __FUNCT__ 112 #define __FUNCT__ "PetscObjectTypeCompare" 113 /*@C 114 PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 115 116 Not Collective 117 118 Input Parameters: 119 + obj - any PETSc object, for example a Vec, Mat or KSP. 120 This must be cast with a (PetscObject), for example, 121 PetscObjectTypeCompare((PetscObject)mat); 122 - type_name - string containing a type name 123 124 Output Parameter: 125 . same - PETSC_TRUE if they are the same, else PETSC_FALSE 126 127 Level: intermediate 128 129 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType() 130 131 Concepts: comparing^object types 132 Concepts: types^comparing 133 Concepts: object type^comparpeing 134 135 @*/ 136 PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 137 { 138 PetscErrorCode ierr; 139 140 PetscFunctionBegin; 141 if (!obj) { 142 *same = PETSC_FALSE; 143 } else if (!type_name && !obj->type_name) { 144 *same = PETSC_TRUE; 145 } else if (!type_name || !obj->type_name) { 146 *same = PETSC_FALSE; 147 } else { 148 PetscValidHeader(obj,1); 149 PetscValidCharPointer(type_name,2); 150 PetscValidPointer(same,3); 151 ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 152 } 153 PetscFunctionReturn(0); 154 } 155 156 #undef __FUNCT__ 157 #define __FUNCT__ "PetscObjectTypeCompareAny" 158 /*@C 159 PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 160 161 Not Collective 162 163 Input Parameters: 164 + obj - any PETSc object, for example a Vec, Mat or KSP. 165 This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 166 - type_name - string containing a type name, pass the empty string "" to terminate the list 167 168 Output Parameter: 169 . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 170 171 Level: intermediate 172 173 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare() 174 175 Concepts: comparing^object types 176 Concepts: types^comparing 177 Concepts: object type^comparing 178 179 @*/ 180 PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 181 { 182 PetscErrorCode ierr; 183 va_list Argp; 184 185 PetscFunctionBegin; 186 *match = PETSC_FALSE; 187 va_start(Argp,type_name); 188 while (type_name && type_name[0]) { 189 PetscBool found; 190 ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 191 if (found) { 192 *match = PETSC_TRUE; 193 break; 194 } 195 type_name = va_arg(Argp,const char*); 196 } 197 va_end(Argp); 198 PetscFunctionReturn(0); 199 } 200 201 #define MAXREGDESOBJS 256 202 static int PetscObjectRegisterDestroy_Count = 0; 203 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 204 205 #undef __FUNCT__ 206 #define __FUNCT__ "PetscObjectRegisterDestroy" 207 /*@C 208 PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 209 PetscFinalize() is called. 210 211 Logically Collective on PetscObject 212 213 Input Parameter: 214 . obj - any PETSc object, for example a Vec, Mat or KSP. 215 This must be cast with a (PetscObject), for example, 216 PetscObjectRegisterDestroy((PetscObject)mat); 217 218 Level: developer 219 220 Notes: 221 This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 222 when PETSc ends. 223 224 .seealso: PetscObjectRegisterDestroyAll() 225 @*/ 226 PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 227 { 228 PetscFunctionBegin; 229 PetscValidHeader(obj,1); 230 if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) { 231 PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 232 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGDESOBJS\n",MAXREGDESOBJS); 233 PetscFunctionReturn(0); 234 } 235 236 #undef __FUNCT__ 237 #define __FUNCT__ "PetscObjectRegisterDestroyAll" 238 /*@C 239 PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 240 with PetscObjectRegisterDestroy(). Called by PetscFinalize() 241 242 Logically Collective on individual PetscObjects 243 244 Level: developer 245 246 .seealso: PetscObjectRegisterDestroy() 247 @*/ 248 PetscErrorCode PetscObjectRegisterDestroyAll(void) 249 { 250 PetscErrorCode ierr; 251 PetscInt i; 252 253 PetscFunctionBegin; 254 for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 255 ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 256 } 257 PetscObjectRegisterDestroy_Count = 0; 258 PetscFunctionReturn(0); 259 } 260 261 262 #define MAXREGFIN 256 263 static int PetscRegisterFinalize_Count = 0; 264 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void)); 265 266 #undef __FUNCT__ 267 #define __FUNCT__ "PetscRegisterFinalize" 268 /*@C 269 PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 270 271 Not Collective 272 273 Input Parameter: 274 . PetscErrorCode (*fun)(void) - 275 276 Level: developer 277 278 Notes: 279 This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 280 281 .seealso: PetscRegisterFinalizeAll() 282 @*/ 283 PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 284 { 285 PetscInt i; 286 287 PetscFunctionBegin; 288 for (i=0; i<PetscRegisterFinalize_Count; i++) { 289 if (f == PetscRegisterFinalize_Functions[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Called twice with same function to register"); 290 } 291 if (PetscRegisterFinalize_Count < MAXREGFIN) { 292 PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 293 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGFIN\n",MAXREGFIN); 294 PetscFunctionReturn(0); 295 } 296 297 #undef __FUNCT__ 298 #define __FUNCT__ "PetscRegisterFinalizeAll" 299 /*@C 300 PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 301 302 Not Collective unless registered functions are collective 303 304 Level: developer 305 306 .seealso: PetscRegisterFinalize() 307 @*/ 308 PetscErrorCode PetscRegisterFinalizeAll(void) 309 { 310 PetscErrorCode ierr; 311 PetscInt i; 312 313 PetscFunctionBegin; 314 for (i=0; i<PetscRegisterFinalize_Count; i++) { 315 ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 316 } 317 PetscRegisterFinalize_Count = 0; 318 PetscFunctionReturn(0); 319 } 320