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