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 { 177 SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name); 178 } 179 PetscFunctionReturn(0); 180 } 181 182 #undef __FUNCT__ 183 #define __FUNCT__ "PetscObjectView" 184 /*@C 185 PetscObjectView - Views any PetscObject, regardless of the type. 186 187 Collective on PetscObject 188 189 Input Parameters: 190 + obj - any PETSc object, for example a Vec, Mat or KSP. 191 This must be cast with a (PetscObject), for example, 192 PetscObjectView((PetscObject)mat,viewer); 193 - viewer - any PETSc viewer 194 195 Level: intermediate 196 197 @*/ 198 PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 199 { 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 PetscValidHeader(obj,1); 204 if (!viewer) { 205 ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 206 } 207 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 208 209 if (obj->bops->view) { 210 ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 211 } else { 212 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 213 } 214 PetscFunctionReturn(0); 215 } 216 217 #undef __FUNCT__ 218 #define __FUNCT__ "PetscTypeCompare" 219 /*@C 220 PetscTypeCompare - Determines whether a PETSc object is of a particular type. 221 222 Not Collective 223 224 Input Parameters: 225 + obj - any PETSc object, for example a Vec, Mat or KSP. 226 This must be cast with a (PetscObject), for example, 227 PetscObjectDestroy((PetscObject)mat); 228 - type_name - string containing a type name 229 230 Output Parameter: 231 . same - PETSC_TRUE if they are the same, else PETSC_FALSE 232 233 Level: intermediate 234 235 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType() 236 237 Concepts: comparing^object types 238 Concepts: types^comparing 239 Concepts: object type^comparing 240 241 @*/ 242 PetscErrorCode PetscTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 243 { 244 PetscErrorCode ierr; 245 246 PetscFunctionBegin; 247 if (!obj) { 248 *same = PETSC_FALSE; 249 } else if (!type_name && !obj->type_name) { 250 *same = PETSC_TRUE; 251 } else if (!type_name || !obj->type_name) { 252 *same = PETSC_FALSE; 253 } else { 254 PetscValidHeader(obj,1); 255 PetscValidCharPointer(type_name,2); 256 PetscValidPointer(same,3); 257 ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 258 } 259 PetscFunctionReturn(0); 260 } 261 262 #define MAXREGDESOBJS 256 263 static int PetscObjectRegisterDestroy_Count = 0; 264 static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 265 266 #undef __FUNCT__ 267 #define __FUNCT__ "PetscObjectRegisterDestroy" 268 /*@C 269 PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 270 PetscFinalize() is called. 271 272 Logically Collective on PetscObject 273 274 Input Parameter: 275 . obj - any PETSc object, for example a Vec, Mat or KSP. 276 This must be cast with a (PetscObject), for example, 277 PetscObjectRegisterDestroy((PetscObject)mat); 278 279 Level: developer 280 281 Notes: 282 This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 283 when PETSc ends. 284 285 .seealso: PetscObjectRegisterDestroyAll() 286 @*/ 287 PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 288 { 289 PetscFunctionBegin; 290 PetscValidHeader(obj,1); 291 if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) { 292 PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 293 } else { 294 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); 295 296 } 297 PetscFunctionReturn(0); 298 } 299 300 #undef __FUNCT__ 301 #define __FUNCT__ "PetscObjectRegisterDestroyAll" 302 /*@C 303 PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 304 with PetscObjectRegisterDestroy(). Called by PetscFinalize() 305 306 Logically Collective on individual PetscObjects 307 308 Level: developer 309 310 .seealso: PetscObjectRegisterDestroy() 311 @*/ 312 PetscErrorCode PetscObjectRegisterDestroyAll(void) 313 { 314 PetscErrorCode ierr; 315 int i; 316 317 PetscFunctionBegin; 318 for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 319 ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 320 } 321 PetscObjectRegisterDestroy_Count = 0; 322 PetscFunctionReturn(0); 323 } 324 325 326 #define MAXREGFIN 256 327 static int PetscRegisterFinalize_Count = 0; 328 static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void)); 329 330 #undef __FUNCT__ 331 #define __FUNCT__ "PetscRegisterFinalize" 332 /*@C 333 PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 334 335 Not Collective 336 337 Input Parameter: 338 . PetscErrorCode (*fun)(void) - 339 340 Level: developer 341 342 Notes: 343 This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 344 345 .seealso: PetscRegisterFinalizeAll() 346 @*/ 347 PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 348 { 349 PetscFunctionBegin; 350 351 if (PetscRegisterFinalize_Count < MAXREGFIN) { 352 PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 353 } else { 354 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); 355 356 } 357 PetscFunctionReturn(0); 358 } 359 360 #undef __FUNCT__ 361 #define __FUNCT__ "PetscRegisterFinalizeAll" 362 /*@C 363 PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 364 365 Not Collective unless registered functions are collective 366 367 Level: developer 368 369 .seealso: PetscRegisterFinalize() 370 @*/ 371 PetscErrorCode PetscRegisterFinalizeAll(void) 372 { 373 PetscErrorCode ierr; 374 int i; 375 376 PetscFunctionBegin; 377 for (i=0; i<PetscRegisterFinalize_Count; i++) { 378 ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 379 } 380 PetscRegisterFinalize_Count = 0; 381 PetscFunctionReturn(0); 382 } 383