17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 6665c2dedSJed Brown #include <petscviewer.h> 7e5c89e4eSSatish Balay 8b436f76fSVictor Eijkhout PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj) 9b436f76fSVictor Eijkhout { 10d42688cbSBarry Smith PetscInt i; 11d42688cbSBarry Smith 12b436f76fSVictor Eijkhout PetscFunctionBegin; 13b436f76fSVictor Eijkhout if (obj->intstar_idmax>0) { 149566063dSJacob Faibussowitsch for (i=0; i<obj->intstar_idmax; i++) PetscCall(PetscFree(obj->intstarcomposeddata[i])); 159566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->intstarcomposeddata,obj->intstarcomposedstate)); 16b436f76fSVictor Eijkhout } 17b436f76fSVictor Eijkhout if (obj->realstar_idmax>0) { 189566063dSJacob Faibussowitsch for (i=0; i<obj->realstar_idmax; i++) PetscCall(PetscFree(obj->realstarcomposeddata[i])); 199566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->realstarcomposeddata,obj->realstarcomposedstate)); 20b436f76fSVictor Eijkhout } 21b436f76fSVictor Eijkhout if (obj->scalarstar_idmax>0) { 229566063dSJacob Faibussowitsch for (i=0; i<obj->scalarstar_idmax; i++) PetscCall(PetscFree(obj->scalarstarcomposeddata[i])); 239566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->scalarstarcomposeddata,obj->scalarstarcomposedstate)); 24b436f76fSVictor Eijkhout } 259566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->intcomposeddata,obj->intcomposedstate)); 269566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->realcomposeddata,obj->realcomposedstate)); 279566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->scalarcomposeddata,obj->scalarcomposedstate)); 28b436f76fSVictor Eijkhout PetscFunctionReturn(0); 29b436f76fSVictor Eijkhout } 30b436f76fSVictor Eijkhout 31e30d2299SSatish Balay /*@ 32e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 33e5c89e4eSSatish Balay 34e5c89e4eSSatish Balay Collective on PetscObject 35e5c89e4eSSatish Balay 36e5c89e4eSSatish Balay Input Parameter: 37e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 38fcfd50ebSBarry Smith This must be cast with a (PetscObject*), for example, 39fcfd50ebSBarry Smith PetscObjectDestroy((PetscObject*)&mat); 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay Level: beginner 42e5c89e4eSSatish Balay 43e5c89e4eSSatish Balay @*/ 44fcfd50ebSBarry Smith PetscErrorCode PetscObjectDestroy(PetscObject *obj) 45e5c89e4eSSatish Balay { 46e5c89e4eSSatish Balay PetscFunctionBegin; 475f80ce2aSJacob Faibussowitsch if (!obj || !*obj) PetscFunctionReturn(0); 486bf464f9SBarry Smith PetscValidHeader(*obj,1); 495f80ce2aSJacob Faibussowitsch PetscCheck((*obj)->bops->destroy,PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",(*obj)->class_name); 509566063dSJacob Faibussowitsch PetscCall((*(*obj)->bops->destroy)(obj)); 51e5c89e4eSSatish Balay PetscFunctionReturn(0); 52e5c89e4eSSatish Balay } 53e5c89e4eSSatish Balay 54e5c89e4eSSatish Balay /*@C 55e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 56e5c89e4eSSatish Balay 57e5c89e4eSSatish Balay Collective on PetscObject 58e5c89e4eSSatish Balay 59e5c89e4eSSatish Balay Input Parameters: 60e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 61e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 62e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 63e5c89e4eSSatish Balay - viewer - any PETSc viewer 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay Level: intermediate 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay @*/ 687087cfbeSBarry Smith PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 69e5c89e4eSSatish Balay { 70e5c89e4eSSatish Balay PetscFunctionBegin; 71e5c89e4eSSatish Balay PetscValidHeader(obj,1); 725f80ce2aSJacob Faibussowitsch PetscCheck(obj->bops->view,PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 739566063dSJacob Faibussowitsch if (!viewer) PetscCall(PetscViewerASCIIGetStdout(obj->comm,&viewer)); 740700a824SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 75e5c89e4eSSatish Balay 769566063dSJacob Faibussowitsch PetscCall((*obj->bops->view)(obj,viewer)); 77e5c89e4eSSatish Balay PetscFunctionReturn(0); 78e5c89e4eSSatish Balay } 79e5c89e4eSSatish Balay 802d747510SLisandro Dalcin /*@C 812d747510SLisandro Dalcin PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed. 822d747510SLisandro Dalcin 832d747510SLisandro Dalcin Collective on PetscObject 842d747510SLisandro Dalcin 852d747510SLisandro Dalcin Input Parameters: 862d747510SLisandro Dalcin + obj - the object 872d747510SLisandro Dalcin . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 882d747510SLisandro Dalcin - optionname - option to activate viewing 892d747510SLisandro Dalcin 902d747510SLisandro Dalcin Level: intermediate 912d747510SLisandro Dalcin 922d747510SLisandro Dalcin @*/ 932d747510SLisandro Dalcin PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[]) 942d747510SLisandro Dalcin { 952d747510SLisandro Dalcin PetscViewer viewer; 962d747510SLisandro Dalcin PetscBool flg; 972d747510SLisandro Dalcin static PetscBool incall = PETSC_FALSE; 982d747510SLisandro Dalcin PetscViewerFormat format; 992d747510SLisandro Dalcin const char *prefix; 1002d747510SLisandro Dalcin 1012d747510SLisandro Dalcin PetscFunctionBegin; 1022d747510SLisandro Dalcin if (incall) PetscFunctionReturn(0); 1032d747510SLisandro Dalcin incall = PETSC_TRUE; 1042d747510SLisandro Dalcin prefix = bobj ? bobj->prefix : obj->prefix; 1059566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg)); 1062d747510SLisandro Dalcin if (flg) { 1079566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer,format)); 1089566063dSJacob Faibussowitsch PetscCall(PetscObjectView(obj,viewer)); 1099566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 1109566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 1119566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 1122d747510SLisandro Dalcin } 1132d747510SLisandro Dalcin incall = PETSC_FALSE; 1142d747510SLisandro Dalcin PetscFunctionReturn(0); 1152d747510SLisandro Dalcin } 1162d747510SLisandro Dalcin 117e5c89e4eSSatish Balay /*@C 118251f4c67SDmitry Karpeev PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 119e5c89e4eSSatish Balay 120e5c89e4eSSatish Balay Not Collective 121e5c89e4eSSatish Balay 122e5c89e4eSSatish Balay Input Parameters: 123e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 124e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 125251f4c67SDmitry Karpeev PetscObjectTypeCompare((PetscObject)mat); 126e5c89e4eSSatish Balay - type_name - string containing a type name 127e5c89e4eSSatish Balay 128e5c89e4eSSatish Balay Output Parameter: 129e5c89e4eSSatish Balay . same - PETSC_TRUE if they are the same, else PETSC_FALSE 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay Level: intermediate 132e5c89e4eSSatish Balay 133db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 134e5c89e4eSSatish Balay 135e5c89e4eSSatish Balay @*/ 136251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 137e5c89e4eSSatish Balay { 138e5c89e4eSSatish Balay PetscFunctionBegin; 1395f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same,3); 140a297a907SKarl Rupp if (!obj) *same = PETSC_FALSE; 141a297a907SKarl Rupp else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 142a297a907SKarl Rupp else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 143a297a907SKarl Rupp else { 144e5c89e4eSSatish Balay PetscValidHeader(obj,1); 145e5c89e4eSSatish Balay PetscValidCharPointer(type_name,2); 1469566063dSJacob Faibussowitsch PetscCall(PetscStrcmp((char*)(obj->type_name),type_name,same)); 147e5c89e4eSSatish Balay } 148e5c89e4eSSatish Balay PetscFunctionReturn(0); 149e5c89e4eSSatish Balay } 150e5c89e4eSSatish Balay 1512b12f010SJed Brown /*@C 1524099cc6bSBarry Smith PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ 1534099cc6bSBarry Smith 1544099cc6bSBarry Smith Not Collective 1554099cc6bSBarry Smith 1564099cc6bSBarry Smith Input Parameters: 1574099cc6bSBarry Smith + mat - the matrix 1584099cc6bSBarry Smith - type_name - string containing a type name 1594099cc6bSBarry Smith 1604099cc6bSBarry Smith Output Parameter: 1614099cc6bSBarry Smith . same - PETSC_TRUE if it is of the same base type 1624099cc6bSBarry Smith 1634099cc6bSBarry Smith Level: intermediate 1644099cc6bSBarry Smith 165db781477SPatrick Sanan .seealso: `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 1664099cc6bSBarry Smith 1674099cc6bSBarry Smith @*/ 1684099cc6bSBarry Smith PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 1694099cc6bSBarry Smith { 1704099cc6bSBarry Smith PetscFunctionBegin; 1715f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same,3); 1724099cc6bSBarry Smith if (!obj) *same = PETSC_FALSE; 1734099cc6bSBarry Smith else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 1744099cc6bSBarry Smith else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 1754099cc6bSBarry Smith else { 1764099cc6bSBarry Smith PetscValidHeader(obj,1); 1774099cc6bSBarry Smith PetscValidCharPointer(type_name,2); 1789566063dSJacob Faibussowitsch PetscCall(PetscStrbeginswith((char*)(obj->type_name),type_name,same)); 1794099cc6bSBarry Smith } 1804099cc6bSBarry Smith PetscFunctionReturn(0); 1814099cc6bSBarry Smith } 1824099cc6bSBarry Smith 1834099cc6bSBarry Smith /*@C 184251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 1852b12f010SJed Brown 1862b12f010SJed Brown Not Collective 1872b12f010SJed Brown 1882b12f010SJed Brown Input Parameters: 1892b12f010SJed Brown + obj - any PETSc object, for example a Vec, Mat or KSP. 190251f4c67SDmitry Karpeev This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 1912b12f010SJed Brown - type_name - string containing a type name, pass the empty string "" to terminate the list 1922b12f010SJed Brown 1932b12f010SJed Brown Output Parameter: 1942b12f010SJed Brown . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 1952b12f010SJed Brown 1962b12f010SJed Brown Level: intermediate 1972b12f010SJed Brown 198*dee2f2dbSPierre Jolivet .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()` 1992b12f010SJed Brown 2002b12f010SJed Brown @*/ 201251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 2022b12f010SJed Brown { 2032b12f010SJed Brown va_list Argp; 2042b12f010SJed Brown 2052b12f010SJed Brown PetscFunctionBegin; 2065f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(match,2); 2072b12f010SJed Brown *match = PETSC_FALSE; 208f73a99e8SStefano Zampini if (!obj) PetscFunctionReturn(0); 2092b12f010SJed Brown va_start(Argp,type_name); 2102b12f010SJed Brown while (type_name && type_name[0]) { 2112b12f010SJed Brown PetscBool found; 2129566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare(obj,type_name,&found)); 2132b12f010SJed Brown if (found) { 2142b12f010SJed Brown *match = PETSC_TRUE; 2152b12f010SJed Brown break; 2162b12f010SJed Brown } 2172b12f010SJed Brown type_name = va_arg(Argp,const char*); 2182b12f010SJed Brown } 2192b12f010SJed Brown va_end(Argp); 2202b12f010SJed Brown PetscFunctionReturn(0); 2212b12f010SJed Brown } 2222b12f010SJed Brown 223b9e7e5c1SBarry Smith /*@C 224b9e7e5c1SBarry Smith PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types. 225b9e7e5c1SBarry Smith 226b9e7e5c1SBarry Smith Not Collective 227b9e7e5c1SBarry Smith 228b9e7e5c1SBarry Smith Input Parameters: 229b9e7e5c1SBarry Smith + obj - any PETSc object, for example a Vec, Mat or KSP. 230b9e7e5c1SBarry Smith This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...); 231b9e7e5c1SBarry Smith - type_name - string containing a type name, pass the empty string "" to terminate the list 232b9e7e5c1SBarry Smith 233b9e7e5c1SBarry Smith Output Parameter: 234b9e7e5c1SBarry Smith . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 235b9e7e5c1SBarry Smith 236b9e7e5c1SBarry Smith Level: intermediate 237b9e7e5c1SBarry Smith 238db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()` 239b9e7e5c1SBarry Smith 240b9e7e5c1SBarry Smith @*/ 241b9e7e5c1SBarry Smith PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 242b9e7e5c1SBarry Smith { 243b9e7e5c1SBarry Smith va_list Argp; 244b9e7e5c1SBarry Smith 245b9e7e5c1SBarry Smith PetscFunctionBegin; 2465f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(match,2); 247b9e7e5c1SBarry Smith *match = PETSC_FALSE; 248b9e7e5c1SBarry Smith va_start(Argp,type_name); 249b9e7e5c1SBarry Smith while (type_name && type_name[0]) { 250b9e7e5c1SBarry Smith PetscBool found; 2519566063dSJacob Faibussowitsch PetscCall(PetscObjectBaseTypeCompare(obj,type_name,&found)); 252b9e7e5c1SBarry Smith if (found) { 253b9e7e5c1SBarry Smith *match = PETSC_TRUE; 254b9e7e5c1SBarry Smith break; 255b9e7e5c1SBarry Smith } 256b9e7e5c1SBarry Smith type_name = va_arg(Argp,const char*); 257b9e7e5c1SBarry Smith } 258b9e7e5c1SBarry Smith va_end(Argp); 259b9e7e5c1SBarry Smith PetscFunctionReturn(0); 260b9e7e5c1SBarry Smith } 261b9e7e5c1SBarry Smith 2623cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 263e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2643cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 265e5c89e4eSSatish Balay 266e5c89e4eSSatish Balay /*@C 267e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 268e5c89e4eSSatish Balay PetscFinalize() is called. 269e5c89e4eSSatish Balay 2703f9fe445SBarry Smith Logically Collective on PetscObject 271e5c89e4eSSatish Balay 272e5c89e4eSSatish Balay Input Parameter: 273e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 274e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 275e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 276e5c89e4eSSatish Balay 277e5c89e4eSSatish Balay Level: developer 278e5c89e4eSSatish Balay 279e5c89e4eSSatish Balay Notes: 280e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 281e5c89e4eSSatish Balay when PETSc ends. 282e5c89e4eSSatish Balay 283db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroyAll()` 284e5c89e4eSSatish Balay @*/ 2857087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 286e5c89e4eSSatish Balay { 287e5c89e4eSSatish Balay PetscFunctionBegin; 288e5c89e4eSSatish Balay PetscValidHeader(obj,1); 2895f80ce2aSJacob Faibussowitsch PetscCheck(PetscObjectRegisterDestroy_Count < MAXREGDESOBJS,PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile %s with larger value for " PetscStringize_(MAXREGDESOBJS),MAXREGDESOBJS,__FILE__); 2905f80ce2aSJacob Faibussowitsch PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 291e5c89e4eSSatish Balay PetscFunctionReturn(0); 292e5c89e4eSSatish Balay } 293e5c89e4eSSatish Balay 294e5c89e4eSSatish Balay /*@C 295e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 296e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 297e5c89e4eSSatish Balay 2983f9fe445SBarry Smith Logically Collective on individual PetscObjects 299e5c89e4eSSatish Balay 300e5c89e4eSSatish Balay Level: developer 301e5c89e4eSSatish Balay 302db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroy()` 303e5c89e4eSSatish Balay @*/ 3047087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroyAll(void) 305e5c89e4eSSatish Balay { 306e5c89e4eSSatish Balay PetscFunctionBegin; 3079566063dSJacob Faibussowitsch for (PetscInt i=0; i<PetscObjectRegisterDestroy_Count; i++) PetscCall(PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i])); 3083cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 309e5c89e4eSSatish Balay PetscFunctionReturn(0); 310e5c89e4eSSatish Balay } 311e5c89e4eSSatish Balay 312eb8be38cSBarry Smith #define MAXREGFIN 256 313eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 31400a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void); 315eb8be38cSBarry Smith 316eb8be38cSBarry Smith /*@C 317eb8be38cSBarry Smith PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 318eb8be38cSBarry Smith 319eb8be38cSBarry Smith Not Collective 320eb8be38cSBarry Smith 321eb8be38cSBarry Smith Input Parameter: 322eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 323eb8be38cSBarry Smith 324eb8be38cSBarry Smith Level: developer 325eb8be38cSBarry Smith 326eb8be38cSBarry Smith Notes: 3272390153bSJed Brown This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 328eb8be38cSBarry Smith 329db781477SPatrick Sanan .seealso: `PetscRegisterFinalizeAll()` 330eb8be38cSBarry Smith @*/ 3317087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 332eb8be38cSBarry Smith { 333f4aac215SBarry Smith PetscFunctionBegin; 3345f80ce2aSJacob Faibussowitsch for (PetscInt i=0; i<PetscRegisterFinalize_Count; i++) { 335aee23540SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 336f4aac215SBarry Smith } 3375f80ce2aSJacob Faibussowitsch PetscCheck(PetscRegisterFinalize_Count < MAXREGFIN,PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile %s with larger value for " PetscStringize_(MAXREGFIN),MAXREGFIN,__FILE__); 3385f80ce2aSJacob Faibussowitsch PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 339eb8be38cSBarry Smith PetscFunctionReturn(0); 340eb8be38cSBarry Smith } 341eb8be38cSBarry Smith 342eb8be38cSBarry Smith /*@C 343eb8be38cSBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 344eb8be38cSBarry Smith 345eb8be38cSBarry Smith Not Collective unless registered functions are collective 346eb8be38cSBarry Smith 347eb8be38cSBarry Smith Level: developer 348eb8be38cSBarry Smith 349db781477SPatrick Sanan .seealso: `PetscRegisterFinalize()` 350eb8be38cSBarry Smith @*/ 3517087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalizeAll(void) 352eb8be38cSBarry Smith { 353eb8be38cSBarry Smith PetscFunctionBegin; 3549566063dSJacob Faibussowitsch for (PetscInt i=0; i<PetscRegisterFinalize_Count; i++) PetscCall((*PetscRegisterFinalize_Functions[i])()); 355eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 356eb8be38cSBarry Smith PetscFunctionReturn(0); 357eb8be38cSBarry Smith } 358