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 8*9371c9d4SSatish Balay PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj) { 9d42688cbSBarry Smith PetscInt i; 10d42688cbSBarry Smith 11b436f76fSVictor Eijkhout PetscFunctionBegin; 12b436f76fSVictor Eijkhout if (obj->intstar_idmax > 0) { 139566063dSJacob Faibussowitsch for (i = 0; i < obj->intstar_idmax; i++) PetscCall(PetscFree(obj->intstarcomposeddata[i])); 149566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->intstarcomposeddata, obj->intstarcomposedstate)); 15b436f76fSVictor Eijkhout } 16b436f76fSVictor Eijkhout if (obj->realstar_idmax > 0) { 179566063dSJacob Faibussowitsch for (i = 0; i < obj->realstar_idmax; i++) PetscCall(PetscFree(obj->realstarcomposeddata[i])); 189566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->realstarcomposeddata, obj->realstarcomposedstate)); 19b436f76fSVictor Eijkhout } 20b436f76fSVictor Eijkhout if (obj->scalarstar_idmax > 0) { 219566063dSJacob Faibussowitsch for (i = 0; i < obj->scalarstar_idmax; i++) PetscCall(PetscFree(obj->scalarstarcomposeddata[i])); 229566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->scalarstarcomposeddata, obj->scalarstarcomposedstate)); 23b436f76fSVictor Eijkhout } 249566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->intcomposeddata, obj->intcomposedstate)); 259566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->realcomposeddata, obj->realcomposedstate)); 269566063dSJacob Faibussowitsch PetscCall(PetscFree2(obj->scalarcomposeddata, obj->scalarcomposedstate)); 27b436f76fSVictor Eijkhout PetscFunctionReturn(0); 28b436f76fSVictor Eijkhout } 29b436f76fSVictor Eijkhout 30e30d2299SSatish Balay /*@ 31e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay Collective on PetscObject 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay Input Parameter: 36e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 37fcfd50ebSBarry Smith This must be cast with a (PetscObject*), for example, 38fcfd50ebSBarry Smith PetscObjectDestroy((PetscObject*)&mat); 39e5c89e4eSSatish Balay 40e5c89e4eSSatish Balay Level: beginner 41e5c89e4eSSatish Balay 42e5c89e4eSSatish Balay @*/ 43*9371c9d4SSatish Balay PetscErrorCode PetscObjectDestroy(PetscObject *obj) { 44e5c89e4eSSatish Balay PetscFunctionBegin; 455f80ce2aSJacob Faibussowitsch if (!obj || !*obj) PetscFunctionReturn(0); 466bf464f9SBarry Smith PetscValidHeader(*obj, 1); 475f80ce2aSJacob 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); 489566063dSJacob Faibussowitsch PetscCall((*(*obj)->bops->destroy)(obj)); 49e5c89e4eSSatish Balay PetscFunctionReturn(0); 50e5c89e4eSSatish Balay } 51e5c89e4eSSatish Balay 52e5c89e4eSSatish Balay /*@C 53e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 54e5c89e4eSSatish Balay 55e5c89e4eSSatish Balay Collective on PetscObject 56e5c89e4eSSatish Balay 57e5c89e4eSSatish Balay Input Parameters: 58e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 59e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 60e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 61e5c89e4eSSatish Balay - viewer - any PETSc viewer 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay Level: intermediate 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay @*/ 66*9371c9d4SSatish Balay PetscErrorCode PetscObjectView(PetscObject obj, PetscViewer viewer) { 67e5c89e4eSSatish Balay PetscFunctionBegin; 68e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 695f80ce2aSJacob Faibussowitsch PetscCheck(obj->bops->view, PETSC_COMM_SELF, PETSC_ERR_SUP, "This PETSc object does not have a generic viewer routine"); 709566063dSJacob Faibussowitsch if (!viewer) PetscCall(PetscViewerASCIIGetStdout(obj->comm, &viewer)); 710700a824SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 72e5c89e4eSSatish Balay 739566063dSJacob Faibussowitsch PetscCall((*obj->bops->view)(obj, viewer)); 74e5c89e4eSSatish Balay PetscFunctionReturn(0); 75e5c89e4eSSatish Balay } 76e5c89e4eSSatish Balay 772d747510SLisandro Dalcin /*@C 782d747510SLisandro Dalcin PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed. 792d747510SLisandro Dalcin 802d747510SLisandro Dalcin Collective on PetscObject 812d747510SLisandro Dalcin 822d747510SLisandro Dalcin Input Parameters: 832d747510SLisandro Dalcin + obj - the object 842d747510SLisandro Dalcin . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 85bb7acecfSBarry Smith - optionname - option string that is used to activate viewing 862d747510SLisandro Dalcin 872d747510SLisandro Dalcin Level: intermediate 882d747510SLisandro Dalcin 892d747510SLisandro Dalcin @*/ 90*9371c9d4SSatish Balay PetscErrorCode PetscObjectViewFromOptions(PetscObject obj, PetscObject bobj, const char optionname[]) { 912d747510SLisandro Dalcin PetscViewer viewer; 922d747510SLisandro Dalcin PetscBool flg; 932d747510SLisandro Dalcin static PetscBool incall = PETSC_FALSE; 942d747510SLisandro Dalcin PetscViewerFormat format; 952d747510SLisandro Dalcin const char *prefix; 962d747510SLisandro Dalcin 972d747510SLisandro Dalcin PetscFunctionBegin; 982d747510SLisandro Dalcin if (incall) PetscFunctionReturn(0); 992d747510SLisandro Dalcin incall = PETSC_TRUE; 1002d747510SLisandro Dalcin prefix = bobj ? bobj->prefix : obj->prefix; 1019566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj), obj->options, prefix, optionname, &viewer, &format, &flg)); 1022d747510SLisandro Dalcin if (flg) { 1039566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, format)); 1049566063dSJacob Faibussowitsch PetscCall(PetscObjectView(obj, viewer)); 1059566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 1069566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 1079566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 1082d747510SLisandro Dalcin } 1092d747510SLisandro Dalcin incall = PETSC_FALSE; 1102d747510SLisandro Dalcin PetscFunctionReturn(0); 1112d747510SLisandro Dalcin } 1122d747510SLisandro Dalcin 113e5c89e4eSSatish Balay /*@C 114251f4c67SDmitry Karpeev PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay Not Collective 117e5c89e4eSSatish Balay 118e5c89e4eSSatish Balay Input Parameters: 119e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 120e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 121251f4c67SDmitry Karpeev PetscObjectTypeCompare((PetscObject)mat); 122e5c89e4eSSatish Balay - type_name - string containing a type name 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay Output Parameter: 125e5c89e4eSSatish Balay . same - PETSC_TRUE if they are the same, else PETSC_FALSE 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay Level: intermediate 128e5c89e4eSSatish Balay 129db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay @*/ 132*9371c9d4SSatish Balay PetscErrorCode PetscObjectTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) { 133e5c89e4eSSatish Balay PetscFunctionBegin; 1345f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same, 3); 135a297a907SKarl Rupp if (!obj) *same = PETSC_FALSE; 136a297a907SKarl Rupp else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 137a297a907SKarl Rupp else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 138a297a907SKarl Rupp else { 139e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 140e5c89e4eSSatish Balay PetscValidCharPointer(type_name, 2); 1419566063dSJacob Faibussowitsch PetscCall(PetscStrcmp((char *)(obj->type_name), type_name, same)); 142e5c89e4eSSatish Balay } 143e5c89e4eSSatish Balay PetscFunctionReturn(0); 144e5c89e4eSSatish Balay } 145e5c89e4eSSatish Balay 1462b12f010SJed Brown /*@C 1474099cc6bSBarry Smith PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ 1484099cc6bSBarry Smith 1494099cc6bSBarry Smith Not Collective 1504099cc6bSBarry Smith 1514099cc6bSBarry Smith Input Parameters: 1524099cc6bSBarry Smith + mat - the matrix 1534099cc6bSBarry Smith - type_name - string containing a type name 1544099cc6bSBarry Smith 1554099cc6bSBarry Smith Output Parameter: 1564099cc6bSBarry Smith . same - PETSC_TRUE if it is of the same base type 1574099cc6bSBarry Smith 1584099cc6bSBarry Smith Level: intermediate 1594099cc6bSBarry Smith 160db781477SPatrick Sanan .seealso: `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 1614099cc6bSBarry Smith 1624099cc6bSBarry Smith @*/ 163*9371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) { 1644099cc6bSBarry Smith PetscFunctionBegin; 1655f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same, 3); 1664099cc6bSBarry Smith if (!obj) *same = PETSC_FALSE; 1674099cc6bSBarry Smith else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 1684099cc6bSBarry Smith else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 1694099cc6bSBarry Smith else { 1704099cc6bSBarry Smith PetscValidHeader(obj, 1); 1714099cc6bSBarry Smith PetscValidCharPointer(type_name, 2); 1729566063dSJacob Faibussowitsch PetscCall(PetscStrbeginswith((char *)(obj->type_name), type_name, same)); 1734099cc6bSBarry Smith } 1744099cc6bSBarry Smith PetscFunctionReturn(0); 1754099cc6bSBarry Smith } 1764099cc6bSBarry Smith 1774099cc6bSBarry Smith /*@C 178251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 1792b12f010SJed Brown 1802b12f010SJed Brown Not Collective 1812b12f010SJed Brown 1822b12f010SJed Brown Input Parameters: 1832b12f010SJed Brown + obj - any PETSc object, for example a Vec, Mat or KSP. 184251f4c67SDmitry Karpeev This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 1852b12f010SJed Brown - type_name - string containing a type name, pass the empty string "" to terminate the list 1862b12f010SJed Brown 1872b12f010SJed Brown Output Parameter: 1882b12f010SJed Brown . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 1892b12f010SJed Brown 1902b12f010SJed Brown Level: intermediate 1912b12f010SJed Brown 192dee2f2dbSPierre Jolivet .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()` 1932b12f010SJed Brown 1942b12f010SJed Brown @*/ 195*9371c9d4SSatish Balay PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj, PetscBool *match, const char type_name[], ...) { 1962b12f010SJed Brown va_list Argp; 1972b12f010SJed Brown 1982b12f010SJed Brown PetscFunctionBegin; 1995f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(match, 2); 2002b12f010SJed Brown *match = PETSC_FALSE; 201f73a99e8SStefano Zampini if (!obj) PetscFunctionReturn(0); 2022b12f010SJed Brown va_start(Argp, type_name); 2032b12f010SJed Brown while (type_name && type_name[0]) { 2042b12f010SJed Brown PetscBool found; 2059566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare(obj, type_name, &found)); 2062b12f010SJed Brown if (found) { 2072b12f010SJed Brown *match = PETSC_TRUE; 2082b12f010SJed Brown break; 2092b12f010SJed Brown } 2102b12f010SJed Brown type_name = va_arg(Argp, const char *); 2112b12f010SJed Brown } 2122b12f010SJed Brown va_end(Argp); 2132b12f010SJed Brown PetscFunctionReturn(0); 2142b12f010SJed Brown } 2152b12f010SJed Brown 216b9e7e5c1SBarry Smith /*@C 217b9e7e5c1SBarry Smith PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types. 218b9e7e5c1SBarry Smith 219b9e7e5c1SBarry Smith Not Collective 220b9e7e5c1SBarry Smith 221b9e7e5c1SBarry Smith Input Parameters: 222b9e7e5c1SBarry Smith + obj - any PETSc object, for example a Vec, Mat or KSP. 223b9e7e5c1SBarry Smith This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...); 224b9e7e5c1SBarry Smith - type_name - string containing a type name, pass the empty string "" to terminate the list 225b9e7e5c1SBarry Smith 226b9e7e5c1SBarry Smith Output Parameter: 227b9e7e5c1SBarry Smith . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 228b9e7e5c1SBarry Smith 229b9e7e5c1SBarry Smith Level: intermediate 230b9e7e5c1SBarry Smith 231db781477SPatrick Sanan .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()` 232b9e7e5c1SBarry Smith 233b9e7e5c1SBarry Smith @*/ 234*9371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj, PetscBool *match, const char type_name[], ...) { 235b9e7e5c1SBarry Smith va_list Argp; 236b9e7e5c1SBarry Smith 237b9e7e5c1SBarry Smith PetscFunctionBegin; 2385f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(match, 2); 239b9e7e5c1SBarry Smith *match = PETSC_FALSE; 240b9e7e5c1SBarry Smith va_start(Argp, type_name); 241b9e7e5c1SBarry Smith while (type_name && type_name[0]) { 242b9e7e5c1SBarry Smith PetscBool found; 2439566063dSJacob Faibussowitsch PetscCall(PetscObjectBaseTypeCompare(obj, type_name, &found)); 244b9e7e5c1SBarry Smith if (found) { 245b9e7e5c1SBarry Smith *match = PETSC_TRUE; 246b9e7e5c1SBarry Smith break; 247b9e7e5c1SBarry Smith } 248b9e7e5c1SBarry Smith type_name = va_arg(Argp, const char *); 249b9e7e5c1SBarry Smith } 250b9e7e5c1SBarry Smith va_end(Argp); 251b9e7e5c1SBarry Smith PetscFunctionReturn(0); 252b9e7e5c1SBarry Smith } 253b9e7e5c1SBarry Smith 2543cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 255e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2563cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 257e5c89e4eSSatish Balay 258e5c89e4eSSatish Balay /*@C 259e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 260e5c89e4eSSatish Balay PetscFinalize() is called. 261e5c89e4eSSatish Balay 2623f9fe445SBarry Smith Logically Collective on PetscObject 263e5c89e4eSSatish Balay 264e5c89e4eSSatish Balay Input Parameter: 265e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 266e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 267e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 268e5c89e4eSSatish Balay 269e5c89e4eSSatish Balay Level: developer 270e5c89e4eSSatish Balay 271e5c89e4eSSatish Balay Notes: 272e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 273e5c89e4eSSatish Balay when PETSc ends. 274e5c89e4eSSatish Balay 275db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroyAll()` 276e5c89e4eSSatish Balay @*/ 277*9371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) { 278e5c89e4eSSatish Balay PetscFunctionBegin; 279e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 2805f80ce2aSJacob 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__); 2815f80ce2aSJacob Faibussowitsch PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 282e5c89e4eSSatish Balay PetscFunctionReturn(0); 283e5c89e4eSSatish Balay } 284e5c89e4eSSatish Balay 285e5c89e4eSSatish Balay /*@C 286e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 287e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 288e5c89e4eSSatish Balay 2893f9fe445SBarry Smith Logically Collective on individual PetscObjects 290e5c89e4eSSatish Balay 291e5c89e4eSSatish Balay Level: developer 292e5c89e4eSSatish Balay 293db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroy()` 294e5c89e4eSSatish Balay @*/ 295*9371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroyAll(void) { 296e5c89e4eSSatish Balay PetscFunctionBegin; 2979566063dSJacob Faibussowitsch for (PetscInt i = 0; i < PetscObjectRegisterDestroy_Count; i++) PetscCall(PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i])); 2983cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 299e5c89e4eSSatish Balay PetscFunctionReturn(0); 300e5c89e4eSSatish Balay } 301e5c89e4eSSatish Balay 302eb8be38cSBarry Smith #define MAXREGFIN 256 303eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 30400a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void); 305eb8be38cSBarry Smith 306eb8be38cSBarry Smith /*@C 307eb8be38cSBarry Smith PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 308eb8be38cSBarry Smith 309eb8be38cSBarry Smith Not Collective 310eb8be38cSBarry Smith 311eb8be38cSBarry Smith Input Parameter: 312eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 313eb8be38cSBarry Smith 314eb8be38cSBarry Smith Level: developer 315eb8be38cSBarry Smith 316eb8be38cSBarry Smith Notes: 3172390153bSJed Brown This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 318eb8be38cSBarry Smith 319db781477SPatrick Sanan .seealso: `PetscRegisterFinalizeAll()` 320eb8be38cSBarry Smith @*/ 321*9371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) { 322f4aac215SBarry Smith PetscFunctionBegin; 3235f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) { 324aee23540SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 325f4aac215SBarry Smith } 3265f80ce2aSJacob 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__); 3275f80ce2aSJacob Faibussowitsch PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 328eb8be38cSBarry Smith PetscFunctionReturn(0); 329eb8be38cSBarry Smith } 330eb8be38cSBarry Smith 331eb8be38cSBarry Smith /*@C 332eb8be38cSBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 333eb8be38cSBarry Smith 334eb8be38cSBarry Smith Not Collective unless registered functions are collective 335eb8be38cSBarry Smith 336eb8be38cSBarry Smith Level: developer 337eb8be38cSBarry Smith 338db781477SPatrick Sanan .seealso: `PetscRegisterFinalize()` 339eb8be38cSBarry Smith @*/ 340*9371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalizeAll(void) { 341eb8be38cSBarry Smith PetscFunctionBegin; 3429566063dSJacob Faibussowitsch for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) PetscCall((*PetscRegisterFinalize_Functions[i])()); 343eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 344eb8be38cSBarry Smith PetscFunctionReturn(0); 345eb8be38cSBarry Smith } 346