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