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