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