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 PetscErrorCode ierr; 11d42688cbSBarry Smith PetscInt i; 12d42688cbSBarry Smith 13b436f76fSVictor Eijkhout PetscFunctionBegin; 14b436f76fSVictor Eijkhout if (obj->intstar_idmax>0) { 15b436f76fSVictor Eijkhout for (i=0; i<obj->intstar_idmax; i++) { 16b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr); 17b436f76fSVictor Eijkhout } 18071fcb05SBarry Smith ierr = PetscFree2(obj->intstarcomposeddata,obj->intstarcomposedstate);CHKERRQ(ierr); 19b436f76fSVictor Eijkhout } 20b436f76fSVictor Eijkhout if (obj->realstar_idmax>0) { 21b436f76fSVictor Eijkhout for (i=0; i<obj->realstar_idmax; i++) { 22b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr); 23b436f76fSVictor Eijkhout } 24071fcb05SBarry Smith ierr = PetscFree2(obj->realstarcomposeddata,obj->realstarcomposedstate);CHKERRQ(ierr); 25b436f76fSVictor Eijkhout } 26b436f76fSVictor Eijkhout if (obj->scalarstar_idmax>0) { 27b436f76fSVictor Eijkhout for (i=0; i<obj->scalarstar_idmax; i++) { 28b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr); 29b436f76fSVictor Eijkhout } 30071fcb05SBarry Smith ierr = PetscFree2(obj->scalarstarcomposeddata,obj->scalarstarcomposedstate);CHKERRQ(ierr); 31b436f76fSVictor Eijkhout } 32071fcb05SBarry Smith ierr = PetscFree2(obj->intcomposeddata,obj->intcomposedstate);CHKERRQ(ierr); 33071fcb05SBarry Smith ierr = PetscFree2(obj->realcomposeddata,obj->realcomposedstate);CHKERRQ(ierr); 34071fcb05SBarry Smith ierr = PetscFree2(obj->scalarcomposeddata,obj->scalarcomposedstate);CHKERRQ(ierr); 35b436f76fSVictor Eijkhout PetscFunctionReturn(0); 36b436f76fSVictor Eijkhout } 37b436f76fSVictor Eijkhout 38e30d2299SSatish Balay /*@ 39e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay Collective on PetscObject 42e5c89e4eSSatish Balay 43e5c89e4eSSatish Balay Input Parameter: 44e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 45fcfd50ebSBarry Smith This must be cast with a (PetscObject*), for example, 46fcfd50ebSBarry Smith PetscObjectDestroy((PetscObject*)&mat); 47e5c89e4eSSatish Balay 48e5c89e4eSSatish Balay Level: beginner 49e5c89e4eSSatish Balay 50e5c89e4eSSatish Balay @*/ 51fcfd50ebSBarry Smith PetscErrorCode PetscObjectDestroy(PetscObject *obj) 52e5c89e4eSSatish Balay { 53e5c89e4eSSatish Balay PetscErrorCode ierr; 54e5c89e4eSSatish Balay 55e5c89e4eSSatish Balay PetscFunctionBegin; 566bf464f9SBarry Smith if (!*obj) PetscFunctionReturn(0); 576bf464f9SBarry Smith PetscValidHeader(*obj,1); 58fcfd50ebSBarry Smith if (*obj && (*obj)->bops->destroy) { 59fcfd50ebSBarry Smith ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr); 606bf464f9SBarry Smith } else if (*obj) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",(*obj)->class_name); 61e5c89e4eSSatish Balay PetscFunctionReturn(0); 62e5c89e4eSSatish Balay } 63e5c89e4eSSatish Balay 64e5c89e4eSSatish Balay /*@C 65e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay Collective on PetscObject 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay Input Parameters: 70e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 71e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 72e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 73e5c89e4eSSatish Balay - viewer - any PETSc viewer 74e5c89e4eSSatish Balay 75e5c89e4eSSatish Balay Level: intermediate 76e5c89e4eSSatish Balay 77e5c89e4eSSatish Balay @*/ 787087cfbeSBarry Smith PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 79e5c89e4eSSatish Balay { 80e5c89e4eSSatish Balay PetscErrorCode ierr; 81e5c89e4eSSatish Balay 82e5c89e4eSSatish Balay PetscFunctionBegin; 83e5c89e4eSSatish Balay PetscValidHeader(obj,1); 843050cee2SBarry Smith if (!viewer) { 853050cee2SBarry Smith ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 863050cee2SBarry Smith } 870700a824SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 88e5c89e4eSSatish Balay 89e5c89e4eSSatish Balay if (obj->bops->view) { 90e5c89e4eSSatish Balay ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 91f23aa3ddSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 92e5c89e4eSSatish Balay PetscFunctionReturn(0); 93e5c89e4eSSatish Balay } 94e5c89e4eSSatish Balay 952d747510SLisandro Dalcin #define CHKERRQI(incall,ierr) if (ierr) {incall = PETSC_FALSE; CHKERRQ(ierr);} 962d747510SLisandro Dalcin 972d747510SLisandro Dalcin /*@C 982d747510SLisandro Dalcin PetscObjectViewFromOptions - Processes command line options to determine if/how a PetscObject is to be viewed. 992d747510SLisandro Dalcin 1002d747510SLisandro Dalcin Collective on PetscObject 1012d747510SLisandro Dalcin 1022d747510SLisandro Dalcin Input Parameters: 1032d747510SLisandro Dalcin + obj - the object 1042d747510SLisandro Dalcin . bobj - optional other object that provides prefix (if NULL then the prefix in obj is used) 1052d747510SLisandro Dalcin - optionname - option to activate viewing 1062d747510SLisandro Dalcin 1072d747510SLisandro Dalcin Level: intermediate 1082d747510SLisandro Dalcin 1092d747510SLisandro Dalcin @*/ 1102d747510SLisandro Dalcin PetscErrorCode PetscObjectViewFromOptions(PetscObject obj,PetscObject bobj,const char optionname[]) 1112d747510SLisandro Dalcin { 1122d747510SLisandro Dalcin PetscErrorCode ierr; 1132d747510SLisandro Dalcin PetscViewer viewer; 1142d747510SLisandro Dalcin PetscBool flg; 1152d747510SLisandro Dalcin static PetscBool incall = PETSC_FALSE; 1162d747510SLisandro Dalcin PetscViewerFormat format; 1172d747510SLisandro Dalcin const char *prefix; 1182d747510SLisandro Dalcin 1192d747510SLisandro Dalcin PetscFunctionBegin; 1202d747510SLisandro Dalcin if (incall) PetscFunctionReturn(0); 1212d747510SLisandro Dalcin incall = PETSC_TRUE; 1222d747510SLisandro Dalcin prefix = bobj ? bobj->prefix : obj->prefix; 12316413a6aSBarry Smith ierr = PetscOptionsGetViewer(PetscObjectComm((PetscObject)obj),obj->options,prefix,optionname,&viewer,&format,&flg);CHKERRQI(incall,ierr); 1242d747510SLisandro Dalcin if (flg) { 1252d747510SLisandro Dalcin ierr = PetscViewerPushFormat(viewer,format);CHKERRQI(incall,ierr); 1262d747510SLisandro Dalcin ierr = PetscObjectView(obj,viewer);CHKERRQI(incall,ierr); 1272d747510SLisandro Dalcin ierr = PetscViewerPopFormat(viewer);CHKERRQI(incall,ierr); 1282d747510SLisandro Dalcin ierr = PetscViewerDestroy(&viewer);CHKERRQI(incall,ierr); 1292d747510SLisandro Dalcin } 1302d747510SLisandro Dalcin incall = PETSC_FALSE; 1312d747510SLisandro Dalcin PetscFunctionReturn(0); 1322d747510SLisandro Dalcin } 1332d747510SLisandro Dalcin 134e5c89e4eSSatish Balay /*@C 135251f4c67SDmitry Karpeev PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 136e5c89e4eSSatish Balay 137e5c89e4eSSatish Balay Not Collective 138e5c89e4eSSatish Balay 139e5c89e4eSSatish Balay Input Parameters: 140e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 141e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 142251f4c67SDmitry Karpeev PetscObjectTypeCompare((PetscObject)mat); 143e5c89e4eSSatish Balay - type_name - string containing a type name 144e5c89e4eSSatish Balay 145e5c89e4eSSatish Balay Output Parameter: 146e5c89e4eSSatish Balay . same - PETSC_TRUE if they are the same, else PETSC_FALSE 147e5c89e4eSSatish Balay 148e5c89e4eSSatish Balay Level: intermediate 149e5c89e4eSSatish Balay 150*b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny() 151e5c89e4eSSatish Balay 152e5c89e4eSSatish Balay @*/ 153251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 154e5c89e4eSSatish Balay { 155e5c89e4eSSatish Balay PetscErrorCode ierr; 156e5c89e4eSSatish Balay 157e5c89e4eSSatish Balay PetscFunctionBegin; 15856499564SJose E. Roman PetscValidPointer(same,3); 159a297a907SKarl Rupp if (!obj) *same = PETSC_FALSE; 160a297a907SKarl Rupp else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 161a297a907SKarl Rupp else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 162a297a907SKarl Rupp else { 163e5c89e4eSSatish Balay PetscValidHeader(obj,1); 164e5c89e4eSSatish Balay PetscValidCharPointer(type_name,2); 165e5c89e4eSSatish Balay ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 166e5c89e4eSSatish Balay } 167e5c89e4eSSatish Balay PetscFunctionReturn(0); 168e5c89e4eSSatish Balay } 169e5c89e4eSSatish Balay 1702b12f010SJed Brown /*@C 1714099cc6bSBarry Smith PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ 1724099cc6bSBarry Smith 1734099cc6bSBarry Smith Not Collective 1744099cc6bSBarry Smith 1754099cc6bSBarry Smith Input Parameters: 1764099cc6bSBarry Smith + mat - the matrix 1774099cc6bSBarry Smith - type_name - string containing a type name 1784099cc6bSBarry Smith 1794099cc6bSBarry Smith Output Parameter: 1804099cc6bSBarry Smith . same - PETSC_TRUE if it is of the same base type 1814099cc6bSBarry Smith 1824099cc6bSBarry Smith Level: intermediate 1834099cc6bSBarry Smith 184*b9e7e5c1SBarry Smith .seealso: PetscObjectTypeCompare(), PetscObjectTypeCompareAny(), PetscObjectBaseTypeCompareAny() 1854099cc6bSBarry Smith 1864099cc6bSBarry Smith @*/ 1874099cc6bSBarry Smith PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 1884099cc6bSBarry Smith { 1894099cc6bSBarry Smith PetscErrorCode ierr; 1904099cc6bSBarry Smith 1914099cc6bSBarry Smith PetscFunctionBegin; 19256499564SJose E. Roman PetscValidPointer(same,3); 1934099cc6bSBarry Smith if (!obj) *same = PETSC_FALSE; 1944099cc6bSBarry Smith else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 1954099cc6bSBarry Smith else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 1964099cc6bSBarry Smith else { 1974099cc6bSBarry Smith PetscValidHeader(obj,1); 1984099cc6bSBarry Smith PetscValidCharPointer(type_name,2); 1994099cc6bSBarry Smith ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 2004099cc6bSBarry Smith } 2014099cc6bSBarry Smith PetscFunctionReturn(0); 2024099cc6bSBarry Smith } 2034099cc6bSBarry Smith 2044099cc6bSBarry Smith /*@C 205251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 2062b12f010SJed Brown 2072b12f010SJed Brown Not Collective 2082b12f010SJed Brown 2092b12f010SJed Brown Input Parameters: 2102b12f010SJed Brown + obj - any PETSc object, for example a Vec, Mat or KSP. 211251f4c67SDmitry Karpeev This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 2122b12f010SJed Brown - type_name - string containing a type name, pass the empty string "" to terminate the list 2132b12f010SJed Brown 2142b12f010SJed Brown Output Parameter: 2152b12f010SJed Brown . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 2162b12f010SJed Brown 2172b12f010SJed Brown Level: intermediate 2182b12f010SJed Brown 219*b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny() 2202b12f010SJed Brown 2212b12f010SJed Brown @*/ 222251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 2232b12f010SJed Brown { 2242b12f010SJed Brown PetscErrorCode ierr; 2252b12f010SJed Brown va_list Argp; 2262b12f010SJed Brown 2272b12f010SJed Brown PetscFunctionBegin; 22856499564SJose E. Roman PetscValidPointer(match,3); 2292b12f010SJed Brown *match = PETSC_FALSE; 2302b12f010SJed Brown va_start(Argp,type_name); 2312b12f010SJed Brown while (type_name && type_name[0]) { 2322b12f010SJed Brown PetscBool found; 233251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 2342b12f010SJed Brown if (found) { 2352b12f010SJed Brown *match = PETSC_TRUE; 2362b12f010SJed Brown break; 2372b12f010SJed Brown } 2382b12f010SJed Brown type_name = va_arg(Argp,const char*); 2392b12f010SJed Brown } 2402b12f010SJed Brown va_end(Argp); 2412b12f010SJed Brown PetscFunctionReturn(0); 2422b12f010SJed Brown } 2432b12f010SJed Brown 244*b9e7e5c1SBarry Smith 245*b9e7e5c1SBarry Smith /*@C 246*b9e7e5c1SBarry Smith PetscObjectBaseTypeCompareAny - Determines whether a PETSc object has the base type of any of a list of types. 247*b9e7e5c1SBarry Smith 248*b9e7e5c1SBarry Smith Not Collective 249*b9e7e5c1SBarry Smith 250*b9e7e5c1SBarry Smith Input Parameters: 251*b9e7e5c1SBarry Smith + obj - any PETSc object, for example a Vec, Mat or KSP. 252*b9e7e5c1SBarry Smith This must be cast with a (PetscObject), for example, PetscObjectBaseTypeCompareAny((PetscObject)mat,...); 253*b9e7e5c1SBarry Smith - type_name - string containing a type name, pass the empty string "" to terminate the list 254*b9e7e5c1SBarry Smith 255*b9e7e5c1SBarry Smith Output Parameter: 256*b9e7e5c1SBarry Smith . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 257*b9e7e5c1SBarry Smith 258*b9e7e5c1SBarry Smith Level: intermediate 259*b9e7e5c1SBarry Smith 260*b9e7e5c1SBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare(), PetscObjectBaseTypeCompare(), PetscObjectTypeCompareAny() 261*b9e7e5c1SBarry Smith 262*b9e7e5c1SBarry Smith @*/ 263*b9e7e5c1SBarry Smith PetscErrorCode PetscObjectBaseTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 264*b9e7e5c1SBarry Smith { 265*b9e7e5c1SBarry Smith PetscErrorCode ierr; 266*b9e7e5c1SBarry Smith va_list Argp; 267*b9e7e5c1SBarry Smith 268*b9e7e5c1SBarry Smith PetscFunctionBegin; 269*b9e7e5c1SBarry Smith PetscValidPointer(match,3); 270*b9e7e5c1SBarry Smith *match = PETSC_FALSE; 271*b9e7e5c1SBarry Smith va_start(Argp,type_name); 272*b9e7e5c1SBarry Smith while (type_name && type_name[0]) { 273*b9e7e5c1SBarry Smith PetscBool found; 274*b9e7e5c1SBarry Smith ierr = PetscObjectBaseTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 275*b9e7e5c1SBarry Smith if (found) { 276*b9e7e5c1SBarry Smith *match = PETSC_TRUE; 277*b9e7e5c1SBarry Smith break; 278*b9e7e5c1SBarry Smith } 279*b9e7e5c1SBarry Smith type_name = va_arg(Argp,const char*); 280*b9e7e5c1SBarry Smith } 281*b9e7e5c1SBarry Smith va_end(Argp); 282*b9e7e5c1SBarry Smith PetscFunctionReturn(0); 283*b9e7e5c1SBarry Smith } 284*b9e7e5c1SBarry Smith 2853cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 286e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2873cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 288e5c89e4eSSatish Balay 289e5c89e4eSSatish Balay /*@C 290e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 291e5c89e4eSSatish Balay PetscFinalize() is called. 292e5c89e4eSSatish Balay 2933f9fe445SBarry Smith Logically Collective on PetscObject 294e5c89e4eSSatish Balay 295e5c89e4eSSatish Balay Input Parameter: 296e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 297e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 298e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 299e5c89e4eSSatish Balay 300e5c89e4eSSatish Balay Level: developer 301e5c89e4eSSatish Balay 302e5c89e4eSSatish Balay Notes: 303e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 304e5c89e4eSSatish Balay when PETSc ends. 305e5c89e4eSSatish Balay 306e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll() 307e5c89e4eSSatish Balay @*/ 3087087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 309e5c89e4eSSatish Balay { 310e5c89e4eSSatish Balay PetscFunctionBegin; 311e5c89e4eSSatish Balay PetscValidHeader(obj,1); 312a825bcd5SBarry Smith if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 313a297a907SKarl Rupp else 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); 314e5c89e4eSSatish Balay PetscFunctionReturn(0); 315e5c89e4eSSatish Balay } 316e5c89e4eSSatish Balay 317e5c89e4eSSatish Balay /*@C 318e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 319e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 320e5c89e4eSSatish Balay 3213f9fe445SBarry Smith Logically Collective on individual PetscObjects 322e5c89e4eSSatish Balay 323e5c89e4eSSatish Balay Level: developer 324e5c89e4eSSatish Balay 325e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy() 326e5c89e4eSSatish Balay @*/ 3277087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroyAll(void) 328e5c89e4eSSatish Balay { 329e5c89e4eSSatish Balay PetscErrorCode ierr; 3308c74ee41SBarry Smith PetscInt i; 331e5c89e4eSSatish Balay 332e5c89e4eSSatish Balay PetscFunctionBegin; 333e5c89e4eSSatish Balay for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 334fcfd50ebSBarry Smith ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 335e5c89e4eSSatish Balay } 3363cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 337e5c89e4eSSatish Balay PetscFunctionReturn(0); 338e5c89e4eSSatish Balay } 339e5c89e4eSSatish Balay 340e5c89e4eSSatish Balay 341eb8be38cSBarry Smith #define MAXREGFIN 256 342eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 34300a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void); 344eb8be38cSBarry Smith 345eb8be38cSBarry Smith /*@C 346eb8be38cSBarry Smith PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 347eb8be38cSBarry Smith 348eb8be38cSBarry Smith Not Collective 349eb8be38cSBarry Smith 350eb8be38cSBarry Smith Input Parameter: 351eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 352eb8be38cSBarry Smith 353eb8be38cSBarry Smith Level: developer 354eb8be38cSBarry Smith 355eb8be38cSBarry Smith Notes: 3562390153bSJed Brown This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 357eb8be38cSBarry Smith 358eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll() 359eb8be38cSBarry Smith @*/ 3607087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 361eb8be38cSBarry Smith { 362f4aac215SBarry Smith PetscInt i; 363eb8be38cSBarry Smith 364f4aac215SBarry Smith PetscFunctionBegin; 365f4aac215SBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 366aee23540SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 367f4aac215SBarry Smith } 368a297a907SKarl Rupp if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 369a297a907SKarl Rupp else 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); 370eb8be38cSBarry Smith PetscFunctionReturn(0); 371eb8be38cSBarry Smith } 372eb8be38cSBarry Smith 373eb8be38cSBarry Smith /*@C 374eb8be38cSBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 375eb8be38cSBarry Smith 376eb8be38cSBarry Smith Not Collective unless registered functions are collective 377eb8be38cSBarry Smith 378eb8be38cSBarry Smith Level: developer 379eb8be38cSBarry Smith 380eb8be38cSBarry Smith .seealso: PetscRegisterFinalize() 381eb8be38cSBarry Smith @*/ 3827087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalizeAll(void) 383eb8be38cSBarry Smith { 384eb8be38cSBarry Smith PetscErrorCode ierr; 3858c74ee41SBarry Smith PetscInt i; 386eb8be38cSBarry Smith 387eb8be38cSBarry Smith PetscFunctionBegin; 388eb8be38cSBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 389eb8be38cSBarry Smith ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 390eb8be38cSBarry Smith } 391eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 392eb8be38cSBarry Smith PetscFunctionReturn(0); 393eb8be38cSBarry Smith } 394