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