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 89371c9d4SSatish 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 /*@ 31*811af0c4SBarry Smith PetscObjectDestroy - Destroys any `PetscObject`, regardless of the type. 32e5c89e4eSSatish Balay 33*811af0c4SBarry Smith Collective on obj 34e5c89e4eSSatish Balay 35e5c89e4eSSatish Balay Input Parameter: 36*811af0c4SBarry Smith . obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. 37*811af0c4SBarry Smith This must be cast with a (`PetscObject`*), for example, 38*811af0c4SBarry Smith `PetscObjectDestroy`((`PetscObject`*)&mat); 39e5c89e4eSSatish Balay 40e5c89e4eSSatish Balay Level: beginner 41e5c89e4eSSatish Balay 42*811af0c4SBarry Smith .seealso: `PetscObject` 43e5c89e4eSSatish Balay @*/ 449371c9d4SSatish Balay PetscErrorCode PetscObjectDestroy(PetscObject *obj) { 45e5c89e4eSSatish Balay PetscFunctionBegin; 465f80ce2aSJacob Faibussowitsch if (!obj || !*obj) PetscFunctionReturn(0); 476bf464f9SBarry Smith PetscValidHeader(*obj, 1); 485f80ce2aSJacob 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); 499566063dSJacob Faibussowitsch PetscCall((*(*obj)->bops->destroy)(obj)); 50e5c89e4eSSatish Balay PetscFunctionReturn(0); 51e5c89e4eSSatish Balay } 52e5c89e4eSSatish Balay 53e5c89e4eSSatish Balay /*@C 54*811af0c4SBarry Smith PetscObjectView - Views any `PetscObject`, regardless of the type. 55e5c89e4eSSatish Balay 56*811af0c4SBarry Smith Collective on obj 57e5c89e4eSSatish Balay 58e5c89e4eSSatish Balay Input Parameters: 59*811af0c4SBarry Smith + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. 60*811af0c4SBarry Smith This must be cast with a (`PetscObject`), for example, 61*811af0c4SBarry Smith `PetscObjectView`((`PetscObject`)mat,viewer); 62e5c89e4eSSatish Balay - viewer - any PETSc viewer 63e5c89e4eSSatish Balay 64e5c89e4eSSatish Balay Level: intermediate 65e5c89e4eSSatish Balay 66*811af0c4SBarry Smith .seealso: `PetscObject`, `PetscObjectViewFromOptions()` 67e5c89e4eSSatish Balay @*/ 689371c9d4SSatish Balay PetscErrorCode PetscObjectView(PetscObject obj, PetscViewer viewer) { 69e5c89e4eSSatish Balay PetscFunctionBegin; 70e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 715f80ce2aSJacob Faibussowitsch PetscCheck(obj->bops->view, PETSC_COMM_SELF, PETSC_ERR_SUP, "This PETSc object does not have a generic viewer routine"); 729566063dSJacob Faibussowitsch if (!viewer) PetscCall(PetscViewerASCIIGetStdout(obj->comm, &viewer)); 730700a824SBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 74e5c89e4eSSatish Balay 759566063dSJacob Faibussowitsch PetscCall((*obj->bops->view)(obj, viewer)); 76e5c89e4eSSatish Balay PetscFunctionReturn(0); 77e5c89e4eSSatish Balay } 78e5c89e4eSSatish Balay 792d747510SLisandro Dalcin /*@C 80*811af0c4SBarry Smith PetscObjectViewFromOptions - Processes command line options to determine if/how a `PetscObject` is to be viewed. 812d747510SLisandro Dalcin 82*811af0c4SBarry Smith Collective on obj 832d747510SLisandro Dalcin 842d747510SLisandro Dalcin Input Parameters: 852d747510SLisandro Dalcin + obj - the object 862d747510SLisandro Dalcin . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 87bb7acecfSBarry Smith - optionname - option string that is used to activate viewing 882d747510SLisandro Dalcin 892d747510SLisandro Dalcin Level: intermediate 902d747510SLisandro Dalcin 91*811af0c4SBarry Smith .seealso: `PetscObject`, `PetscObjectView()` 922d747510SLisandro Dalcin @*/ 939371c9d4SSatish Balay PetscErrorCode PetscObjectViewFromOptions(PetscObject obj, PetscObject bobj, const char optionname[]) { 942d747510SLisandro Dalcin PetscViewer viewer; 952d747510SLisandro Dalcin PetscBool flg; 962d747510SLisandro Dalcin static PetscBool incall = PETSC_FALSE; 972d747510SLisandro Dalcin PetscViewerFormat format; 982d747510SLisandro Dalcin const char *prefix; 992d747510SLisandro Dalcin 1002d747510SLisandro Dalcin PetscFunctionBegin; 1012d747510SLisandro Dalcin if (incall) PetscFunctionReturn(0); 1022d747510SLisandro Dalcin incall = PETSC_TRUE; 1032d747510SLisandro Dalcin prefix = bobj ? bobj->prefix : obj->prefix; 1049566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj), obj->options, prefix, optionname, &viewer, &format, &flg)); 1052d747510SLisandro Dalcin if (flg) { 1069566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, format)); 1079566063dSJacob Faibussowitsch PetscCall(PetscObjectView(obj, viewer)); 1089566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 1099566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 1109566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 1112d747510SLisandro Dalcin } 1122d747510SLisandro Dalcin incall = PETSC_FALSE; 1132d747510SLisandro Dalcin PetscFunctionReturn(0); 1142d747510SLisandro Dalcin } 1152d747510SLisandro Dalcin 116e5c89e4eSSatish Balay /*@C 117251f4c67SDmitry Karpeev PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 118e5c89e4eSSatish Balay 119e5c89e4eSSatish Balay Not Collective 120e5c89e4eSSatish Balay 121e5c89e4eSSatish Balay Input Parameters: 122*811af0c4SBarry Smith + obj - any PETSc object, for example a `Vec`, `Mat or `KSP`. 123*811af0c4SBarry Smith This must be cast with a (`PetscObject`), for example, 124*811af0c4SBarry Smith `PetscObjectTypeCompare`((`PetscObject`)mat); 125e5c89e4eSSatish Balay - type_name - string containing a type name 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay Output Parameter: 128*811af0c4SBarry Smith . same - `PETSC_TRUE` if they are the same, else `PETSC_FALSE` 129e5c89e4eSSatish Balay 130e5c89e4eSSatish Balay Level: intermediate 131e5c89e4eSSatish Balay 132*811af0c4SBarry Smith .seealso: `PetscObject`, `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectBaseTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 133e5c89e4eSSatish Balay @*/ 1349371c9d4SSatish Balay PetscErrorCode PetscObjectTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) { 135e5c89e4eSSatish Balay PetscFunctionBegin; 1365f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same, 3); 137a297a907SKarl Rupp if (!obj) *same = PETSC_FALSE; 138a297a907SKarl Rupp else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 139a297a907SKarl Rupp else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 140a297a907SKarl Rupp else { 141e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 142e5c89e4eSSatish Balay PetscValidCharPointer(type_name, 2); 1439566063dSJacob Faibussowitsch PetscCall(PetscStrcmp((char *)(obj->type_name), type_name, same)); 144e5c89e4eSSatish Balay } 145e5c89e4eSSatish Balay PetscFunctionReturn(0); 146e5c89e4eSSatish Balay } 147e5c89e4eSSatish Balay 1482b12f010SJed Brown /*@C 149*811af0c4SBarry Smith PetscObjectBaseTypeCompare - Determines whether a `PetscObject` is of a given base type. For example the base type of `MATSEQAIJPERM` is `MATSEQAIJ` 1504099cc6bSBarry Smith 1514099cc6bSBarry Smith Not Collective 1524099cc6bSBarry Smith 1534099cc6bSBarry Smith Input Parameters: 1544099cc6bSBarry Smith + mat - the matrix 1554099cc6bSBarry Smith - type_name - string containing a type name 1564099cc6bSBarry Smith 1574099cc6bSBarry Smith Output Parameter: 158*811af0c4SBarry Smith . same - `PETSC_TRUE` if it is of the same base type 1594099cc6bSBarry Smith 1604099cc6bSBarry Smith Level: intermediate 1614099cc6bSBarry Smith 162*811af0c4SBarry Smith .seealso: `PetscObject`, `PetscObjectTypeCompare()`, `PetscObjectTypeCompareAny()`, `PetscObjectBaseTypeCompareAny()` 1634099cc6bSBarry Smith @*/ 1649371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj, const char type_name[], PetscBool *same) { 1654099cc6bSBarry Smith PetscFunctionBegin; 1665f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(same, 3); 1674099cc6bSBarry Smith if (!obj) *same = PETSC_FALSE; 1684099cc6bSBarry Smith else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 1694099cc6bSBarry Smith else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 1704099cc6bSBarry Smith else { 1714099cc6bSBarry Smith PetscValidHeader(obj, 1); 1724099cc6bSBarry Smith PetscValidCharPointer(type_name, 2); 1739566063dSJacob Faibussowitsch PetscCall(PetscStrbeginswith((char *)(obj->type_name), type_name, same)); 1744099cc6bSBarry Smith } 1754099cc6bSBarry Smith PetscFunctionReturn(0); 1764099cc6bSBarry Smith } 1774099cc6bSBarry Smith 1784099cc6bSBarry Smith /*@C 179251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 1802b12f010SJed Brown 1812b12f010SJed Brown Not Collective 1822b12f010SJed Brown 1832b12f010SJed Brown Input Parameters: 184*811af0c4SBarry Smith + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. 185*811af0c4SBarry Smith This must be cast with a (`PetscObjec`t), for example, `PetscObjectTypeCompareAny`((`PetscObject`)mat,...); 186*811af0c4SBarry Smith - type_name - array of strings containing type names, pass the empty string "" to terminate the list 1872b12f010SJed Brown 1882b12f010SJed Brown Output Parameter: 189*811af0c4SBarry Smith . match - `PETSC_TRUE` if the type of obj matches any in the list, else `PETSC_FALSE` 1902b12f010SJed Brown 1912b12f010SJed Brown Level: intermediate 1922b12f010SJed Brown 193dee2f2dbSPierre Jolivet .seealso: `VecGetType()`, `KSPGetType()`, `PCGetType()`, `SNESGetType()`, `PetscObjectTypeCompare()`, `PetscObjectBaseTypeCompare()` 1942b12f010SJed Brown @*/ 1959371c9d4SSatish 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: 222*811af0c4SBarry Smith + obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. 223*811af0c4SBarry Smith This must be cast with a (`PetscObject`), for example, `PetscObjectBaseTypeCompareAny`((`PetscObject`)mat,...); 224*811af0c4SBarry Smith - type_name - array of strings containing type names, pass the empty string "" to terminate the list 225b9e7e5c1SBarry Smith 226b9e7e5c1SBarry Smith Output Parameter: 227*811af0c4SBarry 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 @*/ 2339371c9d4SSatish Balay PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj, PetscBool *match, const char type_name[], ...) { 234b9e7e5c1SBarry Smith va_list Argp; 235b9e7e5c1SBarry Smith 236b9e7e5c1SBarry Smith PetscFunctionBegin; 2375f80ce2aSJacob Faibussowitsch PetscValidBoolPointer(match, 2); 238b9e7e5c1SBarry Smith *match = PETSC_FALSE; 239b9e7e5c1SBarry Smith va_start(Argp, type_name); 240b9e7e5c1SBarry Smith while (type_name && type_name[0]) { 241b9e7e5c1SBarry Smith PetscBool found; 2429566063dSJacob Faibussowitsch PetscCall(PetscObjectBaseTypeCompare(obj, type_name, &found)); 243b9e7e5c1SBarry Smith if (found) { 244b9e7e5c1SBarry Smith *match = PETSC_TRUE; 245b9e7e5c1SBarry Smith break; 246b9e7e5c1SBarry Smith } 247b9e7e5c1SBarry Smith type_name = va_arg(Argp, const char *); 248b9e7e5c1SBarry Smith } 249b9e7e5c1SBarry Smith va_end(Argp); 250b9e7e5c1SBarry Smith PetscFunctionReturn(0); 251b9e7e5c1SBarry Smith } 252b9e7e5c1SBarry Smith 2533cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 254e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2553cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 256e5c89e4eSSatish Balay 257e5c89e4eSSatish Balay /*@C 258e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 259*811af0c4SBarry Smith `PetscFinalize()` is called. 260e5c89e4eSSatish Balay 261*811af0c4SBarry Smith Logically Collective on obj 262e5c89e4eSSatish Balay 263e5c89e4eSSatish Balay Input Parameter: 264*811af0c4SBarry Smith . obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. 265*811af0c4SBarry Smith This must be cast with a (`PetscObject`), for example, 266*811af0c4SBarry Smith `PetscObjectRegisterDestroy`((`PetscObject`)mat); 267e5c89e4eSSatish Balay 268e5c89e4eSSatish Balay Level: developer 269e5c89e4eSSatish Balay 270*811af0c4SBarry Smith Note: 271e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 272e5c89e4eSSatish Balay when PETSc ends. 273e5c89e4eSSatish Balay 274db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroyAll()` 275e5c89e4eSSatish Balay @*/ 2769371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) { 277e5c89e4eSSatish Balay PetscFunctionBegin; 278e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 2795f80ce2aSJacob 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__); 2805f80ce2aSJacob Faibussowitsch PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 281e5c89e4eSSatish Balay PetscFunctionReturn(0); 282e5c89e4eSSatish Balay } 283e5c89e4eSSatish Balay 284e5c89e4eSSatish Balay /*@C 285e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 286*811af0c4SBarry Smith with `PetscObjectRegisterDestroy()`. Called by `PetscFinalize()` 287e5c89e4eSSatish Balay 288*811af0c4SBarry Smith Logically Collective on the individual `PetscObject`s that are being processed 289e5c89e4eSSatish Balay 290e5c89e4eSSatish Balay Level: developer 291e5c89e4eSSatish Balay 292db781477SPatrick Sanan .seealso: `PetscObjectRegisterDestroy()` 293e5c89e4eSSatish Balay @*/ 2949371c9d4SSatish Balay PetscErrorCode PetscObjectRegisterDestroyAll(void) { 295e5c89e4eSSatish Balay PetscFunctionBegin; 2969566063dSJacob Faibussowitsch for (PetscInt i = 0; i < PetscObjectRegisterDestroy_Count; i++) PetscCall(PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i])); 2973cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 298e5c89e4eSSatish Balay PetscFunctionReturn(0); 299e5c89e4eSSatish Balay } 300e5c89e4eSSatish Balay 301eb8be38cSBarry Smith #define MAXREGFIN 256 302eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 30300a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void); 304eb8be38cSBarry Smith 305eb8be38cSBarry Smith /*@C 306*811af0c4SBarry Smith PetscRegisterFinalize - Registers a function that is to be called in `PetscFinalize()` 307eb8be38cSBarry Smith 308eb8be38cSBarry Smith Not Collective 309eb8be38cSBarry Smith 310eb8be38cSBarry Smith Input Parameter: 311eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 312eb8be38cSBarry Smith 313eb8be38cSBarry Smith Level: developer 314eb8be38cSBarry Smith 315*811af0c4SBarry Smith Note: 316*811af0c4SBarry Smith This is used by, for example, `DMInitializePackage()` to have `DMFinalizePackage()` called 317eb8be38cSBarry Smith 318db781477SPatrick Sanan .seealso: `PetscRegisterFinalizeAll()` 319eb8be38cSBarry Smith @*/ 3209371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) { 321f4aac215SBarry Smith PetscFunctionBegin; 3225f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) { 323aee23540SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 324f4aac215SBarry Smith } 3255f80ce2aSJacob 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__); 3265f80ce2aSJacob Faibussowitsch PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 327eb8be38cSBarry Smith PetscFunctionReturn(0); 328eb8be38cSBarry Smith } 329eb8be38cSBarry Smith 330eb8be38cSBarry Smith /*@C 331*811af0c4SBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with `PetscRegisterFinalize()` 332eb8be38cSBarry Smith 333eb8be38cSBarry Smith Not Collective unless registered functions are collective 334eb8be38cSBarry Smith 335eb8be38cSBarry Smith Level: developer 336eb8be38cSBarry Smith 337db781477SPatrick Sanan .seealso: `PetscRegisterFinalize()` 338eb8be38cSBarry Smith @*/ 3399371c9d4SSatish Balay PetscErrorCode PetscRegisterFinalizeAll(void) { 340eb8be38cSBarry Smith PetscFunctionBegin; 3419566063dSJacob Faibussowitsch for (PetscInt i = 0; i < PetscRegisterFinalize_Count; i++) PetscCall((*PetscRegisterFinalize_Functions[i])()); 342eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 343eb8be38cSBarry Smith PetscFunctionReturn(0); 344eb8be38cSBarry Smith } 345