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 /*@C 106 PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 107 108 Not Collective 109 110 Input Parameters: 111 + obj - any PETSc object, for example a Vec, Mat or KSP. 112 This must be cast with a (PetscObject), for example, 113 PetscObjectTypeCompare((PetscObject)mat); 114 - type_name - string containing a type name 115 116 Output Parameter: 117 . same - PETSC_TRUE if they are the same, else PETSC_FALSE 118 119 Level: intermediate 120 121 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare() 122 123 Concepts: comparing^object types 124 Concepts: types^comparing 125 Concepts: object type^comparpeing 126 127 @*/ 128 PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 129 { 130 PetscErrorCode ierr; 131 132 PetscFunctionBegin; 133 if (!obj) *same = PETSC_FALSE; 134 else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 135 else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 136 else { 137 PetscValidHeader(obj,1); 138 PetscValidCharPointer(type_name,2); 139 PetscValidPointer(same,3); 140 ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 141 } 142 PetscFunctionReturn(0); 143 } 144 145 /*@C 146 PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ 147 148 Not Collective 149 150 Input Parameters: 151 + mat - the matrix 152 - type_name - string containing a type name 153 154 Output Parameter: 155 . same - PETSC_TRUE if it is of the same base type 156 157 Level: intermediate 158 159 .seealso: PetscObjectTypeCompare() 160 161 162 @*/ 163 PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 164 { 165 PetscErrorCode ierr; 166 167 PetscFunctionBegin; 168 if (!obj) *same = PETSC_FALSE; 169 else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 170 else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 171 else { 172 PetscValidHeader(obj,1); 173 PetscValidCharPointer(type_name,2); 174 PetscValidPointer(same,3); 175 ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 176 } 177 PetscFunctionReturn(0); 178 } 179 180 /*@C 181 PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 182 183 Not Collective 184 185 Input Parameters: 186 + obj - any PETSc object, for example a Vec, Mat or KSP. 187 This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 188 - type_name - string containing a type name, pass the empty string "" to terminate the list 189 190 Output Parameter: 191 . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 192 193 Level: intermediate 194 195 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare() 196 197 Concepts: comparing^object types 198 Concepts: types^comparing 199 Concepts: object type^comparing 200 201 @*/ 202 PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 203 { 204 PetscErrorCode ierr; 205 va_list Argp; 206 207 PetscFunctionBegin; 208 *match = PETSC_FALSE; 209 va_start(Argp,type_name); 210 while (type_name && type_name[0]) { 211 PetscBool found; 212 ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 213 if (found) { 214 *match = PETSC_TRUE; 215 break; 216 } 217 type_name = va_arg(Argp,const char*); 218 } 219 va_end(Argp); 220 PetscFunctionReturn(0); 221 } 222 223 #define MAXREGDESOBJS 256 224 static int PetscObjectRegisterDestroy_Count = 0; 225 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 226 227 /*@C 228 PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 229 PetscFinalize() is called. 230 231 Logically Collective on PetscObject 232 233 Input Parameter: 234 . obj - any PETSc object, for example a Vec, Mat or KSP. 235 This must be cast with a (PetscObject), for example, 236 PetscObjectRegisterDestroy((PetscObject)mat); 237 238 Level: developer 239 240 Notes: 241 This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 242 when PETSc ends. 243 244 .seealso: PetscObjectRegisterDestroyAll() 245 @*/ 246 PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 247 { 248 PetscFunctionBegin; 249 PetscValidHeader(obj,1); 250 if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 251 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); 252 PetscFunctionReturn(0); 253 } 254 255 /*@C 256 PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 257 with PetscObjectRegisterDestroy(). Called by PetscFinalize() 258 259 Logically Collective on individual PetscObjects 260 261 Level: developer 262 263 .seealso: PetscObjectRegisterDestroy() 264 @*/ 265 PetscErrorCode PetscObjectRegisterDestroyAll(void) 266 { 267 PetscErrorCode ierr; 268 PetscInt i; 269 270 PetscFunctionBegin; 271 for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 272 ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 273 } 274 PetscObjectRegisterDestroy_Count = 0; 275 PetscFunctionReturn(0); 276 } 277 278 279 #define MAXREGFIN 256 280 static int PetscRegisterFinalize_Count = 0; 281 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void)); 282 283 /*@C 284 PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 285 286 Not Collective 287 288 Input Parameter: 289 . PetscErrorCode (*fun)(void) - 290 291 Level: developer 292 293 Notes: 294 This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 295 296 .seealso: PetscRegisterFinalizeAll() 297 @*/ 298 PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 299 { 300 PetscInt i; 301 302 PetscFunctionBegin; 303 for (i=0; i<PetscRegisterFinalize_Count; i++) { 304 if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 305 } 306 if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 307 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); 308 PetscFunctionReturn(0); 309 } 310 311 /*@C 312 PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 313 314 Not Collective unless registered functions are collective 315 316 Level: developer 317 318 .seealso: PetscRegisterFinalize() 319 @*/ 320 PetscErrorCode PetscRegisterFinalizeAll(void) 321 { 322 PetscErrorCode ierr; 323 PetscInt i; 324 325 PetscFunctionBegin; 326 for (i=0; i<PetscRegisterFinalize_Count; i++) { 327 ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 328 } 329 PetscRegisterFinalize_Count = 0; 330 PetscFunctionReturn(0); 331 } 332