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