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