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 } 18b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr); 19b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr); 20b436f76fSVictor Eijkhout } 21b436f76fSVictor Eijkhout if (obj->realstar_idmax>0) { 22b436f76fSVictor Eijkhout for (i=0; i<obj->realstar_idmax; i++) { 23b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr); 24b436f76fSVictor Eijkhout } 25b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr); 26b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr); 27b436f76fSVictor Eijkhout } 28b436f76fSVictor Eijkhout if (obj->scalarstar_idmax>0) { 29b436f76fSVictor Eijkhout for (i=0; i<obj->scalarstar_idmax; i++) { 30b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr); 31b436f76fSVictor Eijkhout } 32b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr); 33b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr); 34b436f76fSVictor Eijkhout } 35d42688cbSBarry Smith ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr); 36d42688cbSBarry Smith ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr); 37d42688cbSBarry Smith ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr); 38d42688cbSBarry Smith ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr); 39d42688cbSBarry Smith ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr); 40d42688cbSBarry Smith ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr); 41b436f76fSVictor Eijkhout PetscFunctionReturn(0); 42b436f76fSVictor Eijkhout } 43b436f76fSVictor Eijkhout 44e30d2299SSatish Balay /*@ 45e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 46e5c89e4eSSatish Balay 47e5c89e4eSSatish Balay Collective on PetscObject 48e5c89e4eSSatish Balay 49e5c89e4eSSatish Balay Input Parameter: 50e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 51fcfd50ebSBarry Smith This must be cast with a (PetscObject*), for example, 52fcfd50ebSBarry Smith PetscObjectDestroy((PetscObject*)&mat); 53e5c89e4eSSatish Balay 54e5c89e4eSSatish Balay Level: beginner 55e5c89e4eSSatish Balay 56e5c89e4eSSatish Balay Concepts: destroying object 57e5c89e4eSSatish Balay Concepts: freeing object 58e5c89e4eSSatish Balay Concepts: deleting object 59e5c89e4eSSatish Balay 60e5c89e4eSSatish Balay @*/ 61fcfd50ebSBarry Smith PetscErrorCode PetscObjectDestroy(PetscObject *obj) 62e5c89e4eSSatish Balay { 63e5c89e4eSSatish Balay PetscErrorCode ierr; 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay PetscFunctionBegin; 666bf464f9SBarry Smith if (!*obj) PetscFunctionReturn(0); 676bf464f9SBarry Smith PetscValidHeader(*obj,1); 68fcfd50ebSBarry Smith if (*obj && (*obj)->bops->destroy) { 69fcfd50ebSBarry Smith ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr); 706bf464f9SBarry 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); 71e5c89e4eSSatish Balay PetscFunctionReturn(0); 72e5c89e4eSSatish Balay } 73e5c89e4eSSatish Balay 74e5c89e4eSSatish Balay /*@C 75e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 76e5c89e4eSSatish Balay 77e5c89e4eSSatish Balay Collective on PetscObject 78e5c89e4eSSatish Balay 79e5c89e4eSSatish Balay Input Parameters: 80e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 81e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 82e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 83e5c89e4eSSatish Balay - viewer - any PETSc viewer 84e5c89e4eSSatish Balay 85e5c89e4eSSatish Balay Level: intermediate 86e5c89e4eSSatish Balay 87e5c89e4eSSatish Balay @*/ 887087cfbeSBarry Smith PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 89e5c89e4eSSatish Balay { 90e5c89e4eSSatish Balay PetscErrorCode ierr; 91e5c89e4eSSatish Balay 92e5c89e4eSSatish Balay PetscFunctionBegin; 93e5c89e4eSSatish Balay PetscValidHeader(obj,1); 943050cee2SBarry Smith if (!viewer) { 953050cee2SBarry Smith ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 963050cee2SBarry Smith } 970700a824SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 98e5c89e4eSSatish Balay 99e5c89e4eSSatish Balay if (obj->bops->view) { 100e5c89e4eSSatish Balay ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 101f23aa3ddSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 102e5c89e4eSSatish Balay PetscFunctionReturn(0); 103e5c89e4eSSatish Balay } 104e5c89e4eSSatish Balay 105e5c89e4eSSatish Balay /*@C 106251f4c67SDmitry Karpeev PetscObjectTypeCompare - Determines whether a PETSc object is of a particular type. 107e5c89e4eSSatish Balay 108e5c89e4eSSatish Balay Not Collective 109e5c89e4eSSatish Balay 110e5c89e4eSSatish Balay Input Parameters: 111e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 112e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 113251f4c67SDmitry Karpeev PetscObjectTypeCompare((PetscObject)mat); 114e5c89e4eSSatish Balay - type_name - string containing a type name 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay Output Parameter: 117e5c89e4eSSatish Balay . same - PETSC_TRUE if they are the same, else PETSC_FALSE 118e5c89e4eSSatish Balay 119e5c89e4eSSatish Balay Level: intermediate 120e5c89e4eSSatish Balay 1214099cc6bSBarry Smith .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectBaseTypeCompare() 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay Concepts: comparing^object types 124e5c89e4eSSatish Balay Concepts: types^comparing 125251f4c67SDmitry Karpeev Concepts: object type^comparpeing 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay @*/ 128251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 129e5c89e4eSSatish Balay { 130e5c89e4eSSatish Balay PetscErrorCode ierr; 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay PetscFunctionBegin; 133a297a907SKarl Rupp if (!obj) *same = PETSC_FALSE; 134a297a907SKarl Rupp else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 135a297a907SKarl Rupp else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 136a297a907SKarl Rupp else { 137e5c89e4eSSatish Balay PetscValidHeader(obj,1); 138e5c89e4eSSatish Balay PetscValidCharPointer(type_name,2); 139e5c89e4eSSatish Balay PetscValidPointer(same,3); 140e5c89e4eSSatish Balay ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 141e5c89e4eSSatish Balay } 142e5c89e4eSSatish Balay PetscFunctionReturn(0); 143e5c89e4eSSatish Balay } 144e5c89e4eSSatish Balay 1452b12f010SJed Brown /*@C 1464099cc6bSBarry Smith PetscObjectBaseTypeCompare - Determines whether a PetscObject is of a given base type. For example the base type of MATSEQAIJPERM is MATSEQAIJ 1474099cc6bSBarry Smith 1484099cc6bSBarry Smith Not Collective 1494099cc6bSBarry Smith 1504099cc6bSBarry Smith Input Parameters: 1514099cc6bSBarry Smith + mat - the matrix 1524099cc6bSBarry Smith - type_name - string containing a type name 1534099cc6bSBarry Smith 1544099cc6bSBarry Smith Output Parameter: 1554099cc6bSBarry Smith . same - PETSC_TRUE if it is of the same base type 1564099cc6bSBarry Smith 1574099cc6bSBarry Smith Level: intermediate 1584099cc6bSBarry Smith 1594099cc6bSBarry Smith .seealso: PetscObjectTypeCompare() 1604099cc6bSBarry Smith 1614099cc6bSBarry Smith 1624099cc6bSBarry Smith @*/ 1634099cc6bSBarry Smith PetscErrorCode PetscObjectBaseTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 1644099cc6bSBarry Smith { 1654099cc6bSBarry Smith PetscErrorCode ierr; 1664099cc6bSBarry Smith 1674099cc6bSBarry Smith PetscFunctionBegin; 1684099cc6bSBarry Smith if (!obj) *same = PETSC_FALSE; 1694099cc6bSBarry Smith else if (!type_name && !obj->type_name) *same = PETSC_TRUE; 1704099cc6bSBarry Smith else if (!type_name || !obj->type_name) *same = PETSC_FALSE; 1714099cc6bSBarry Smith else { 1724099cc6bSBarry Smith PetscValidHeader(obj,1); 1734099cc6bSBarry Smith PetscValidCharPointer(type_name,2); 1744099cc6bSBarry Smith PetscValidPointer(same,3); 1754099cc6bSBarry Smith ierr = PetscStrbeginswith((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 1764099cc6bSBarry Smith } 1774099cc6bSBarry Smith PetscFunctionReturn(0); 1784099cc6bSBarry Smith } 1794099cc6bSBarry Smith 1804099cc6bSBarry Smith /*@C 181251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 1822b12f010SJed Brown 1832b12f010SJed Brown Not Collective 1842b12f010SJed Brown 1852b12f010SJed Brown Input Parameters: 1862b12f010SJed Brown + obj - any PETSc object, for example a Vec, Mat or KSP. 187251f4c67SDmitry Karpeev This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 1882b12f010SJed Brown - type_name - string containing a type name, pass the empty string "" to terminate the list 1892b12f010SJed Brown 1902b12f010SJed Brown Output Parameter: 1912b12f010SJed Brown . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 1922b12f010SJed Brown 1932b12f010SJed Brown Level: intermediate 1942b12f010SJed Brown 195251f4c67SDmitry Karpeev .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare() 1962b12f010SJed Brown 1972b12f010SJed Brown Concepts: comparing^object types 1982b12f010SJed Brown Concepts: types^comparing 1992b12f010SJed Brown Concepts: object type^comparing 2002b12f010SJed Brown 2012b12f010SJed Brown @*/ 202251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 2032b12f010SJed Brown { 2042b12f010SJed Brown PetscErrorCode ierr; 2052b12f010SJed Brown va_list Argp; 2062b12f010SJed Brown 2072b12f010SJed Brown PetscFunctionBegin; 2082b12f010SJed Brown *match = PETSC_FALSE; 2092b12f010SJed Brown va_start(Argp,type_name); 2102b12f010SJed Brown while (type_name && type_name[0]) { 2112b12f010SJed Brown PetscBool found; 212251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 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 2233cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 224e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2253cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 226e5c89e4eSSatish Balay 227e5c89e4eSSatish Balay /*@C 228e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 229e5c89e4eSSatish Balay PetscFinalize() is called. 230e5c89e4eSSatish Balay 2313f9fe445SBarry Smith Logically Collective on PetscObject 232e5c89e4eSSatish Balay 233e5c89e4eSSatish Balay Input Parameter: 234e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 235e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 236e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 237e5c89e4eSSatish Balay 238e5c89e4eSSatish Balay Level: developer 239e5c89e4eSSatish Balay 240e5c89e4eSSatish Balay Notes: 241e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 242e5c89e4eSSatish Balay when PETSc ends. 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll() 245e5c89e4eSSatish Balay @*/ 2467087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 247e5c89e4eSSatish Balay { 248e5c89e4eSSatish Balay PetscFunctionBegin; 249e5c89e4eSSatish Balay PetscValidHeader(obj,1); 250a825bcd5SBarry Smith if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 251a297a907SKarl 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); 252e5c89e4eSSatish Balay PetscFunctionReturn(0); 253e5c89e4eSSatish Balay } 254e5c89e4eSSatish Balay 255e5c89e4eSSatish Balay /*@C 256e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 257e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 258e5c89e4eSSatish Balay 2593f9fe445SBarry Smith Logically Collective on individual PetscObjects 260e5c89e4eSSatish Balay 261e5c89e4eSSatish Balay Level: developer 262e5c89e4eSSatish Balay 263e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy() 264e5c89e4eSSatish Balay @*/ 2657087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroyAll(void) 266e5c89e4eSSatish Balay { 267e5c89e4eSSatish Balay PetscErrorCode ierr; 2688c74ee41SBarry Smith PetscInt i; 269e5c89e4eSSatish Balay 270e5c89e4eSSatish Balay PetscFunctionBegin; 271e5c89e4eSSatish Balay for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 272fcfd50ebSBarry Smith ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 273e5c89e4eSSatish Balay } 2743cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 275e5c89e4eSSatish Balay PetscFunctionReturn(0); 276e5c89e4eSSatish Balay } 277e5c89e4eSSatish Balay 278e5c89e4eSSatish Balay 279eb8be38cSBarry Smith #define MAXREGFIN 256 280eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 281*00a402e0SLisandro Dalcin static PetscErrorCode (*PetscRegisterFinalize_Functions[MAXREGFIN])(void); 282eb8be38cSBarry Smith 283eb8be38cSBarry Smith /*@C 284eb8be38cSBarry Smith PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 285eb8be38cSBarry Smith 286eb8be38cSBarry Smith Not Collective 287eb8be38cSBarry Smith 288eb8be38cSBarry Smith Input Parameter: 289eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 290eb8be38cSBarry Smith 291eb8be38cSBarry Smith Level: developer 292eb8be38cSBarry Smith 293eb8be38cSBarry Smith Notes: 2942390153bSJed Brown This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 295eb8be38cSBarry Smith 296eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll() 297eb8be38cSBarry Smith @*/ 2987087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 299eb8be38cSBarry Smith { 300f4aac215SBarry Smith PetscInt i; 301eb8be38cSBarry Smith 302f4aac215SBarry Smith PetscFunctionBegin; 303f4aac215SBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 304aee23540SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) PetscFunctionReturn(0); 305f4aac215SBarry Smith } 306a297a907SKarl Rupp if (PetscRegisterFinalize_Count < MAXREGFIN) PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 307a297a907SKarl 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); 308eb8be38cSBarry Smith PetscFunctionReturn(0); 309eb8be38cSBarry Smith } 310eb8be38cSBarry Smith 311eb8be38cSBarry Smith /*@C 312eb8be38cSBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 313eb8be38cSBarry Smith 314eb8be38cSBarry Smith Not Collective unless registered functions are collective 315eb8be38cSBarry Smith 316eb8be38cSBarry Smith Level: developer 317eb8be38cSBarry Smith 318eb8be38cSBarry Smith .seealso: PetscRegisterFinalize() 319eb8be38cSBarry Smith @*/ 3207087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalizeAll(void) 321eb8be38cSBarry Smith { 322eb8be38cSBarry Smith PetscErrorCode ierr; 3238c74ee41SBarry Smith PetscInt i; 324eb8be38cSBarry Smith 325eb8be38cSBarry Smith PetscFunctionBegin; 326eb8be38cSBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 327eb8be38cSBarry Smith ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 328eb8be38cSBarry Smith } 329eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 330eb8be38cSBarry Smith PetscFunctionReturn(0); 331eb8be38cSBarry Smith } 332