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