17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay 8d42688cbSBarry Smith #undef __FUNCT__ 9d42688cbSBarry Smith #define __FUNCT__ "PetscComposedQuantitiesDestroy" 10b436f76fSVictor Eijkhout PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj) 11b436f76fSVictor Eijkhout { 12d42688cbSBarry Smith PetscErrorCode ierr; 13d42688cbSBarry Smith PetscInt i; 14d42688cbSBarry Smith 15b436f76fSVictor Eijkhout PetscFunctionBegin; 16b436f76fSVictor Eijkhout if (obj->intstar_idmax>0) { 17b436f76fSVictor Eijkhout for (i=0; i<obj->intstar_idmax; i++) { 18b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposeddata[i]);CHKERRQ(ierr); 19b436f76fSVictor Eijkhout } 20b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposeddata);CHKERRQ(ierr); 21b436f76fSVictor Eijkhout ierr = PetscFree(obj->intstarcomposedstate);CHKERRQ(ierr); 22b436f76fSVictor Eijkhout } 23b436f76fSVictor Eijkhout if (obj->realstar_idmax>0) { 24b436f76fSVictor Eijkhout for (i=0; i<obj->realstar_idmax; i++) { 25b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposeddata[i]);CHKERRQ(ierr); 26b436f76fSVictor Eijkhout } 27b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposeddata);CHKERRQ(ierr); 28b436f76fSVictor Eijkhout ierr = PetscFree(obj->realstarcomposedstate);CHKERRQ(ierr); 29b436f76fSVictor Eijkhout } 30b436f76fSVictor Eijkhout if (obj->scalarstar_idmax>0) { 31b436f76fSVictor Eijkhout for (i=0; i<obj->scalarstar_idmax; i++) { 32b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposeddata[i]);CHKERRQ(ierr); 33b436f76fSVictor Eijkhout } 34b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposeddata);CHKERRQ(ierr); 35b436f76fSVictor Eijkhout ierr = PetscFree(obj->scalarstarcomposedstate);CHKERRQ(ierr); 36b436f76fSVictor Eijkhout } 37d42688cbSBarry Smith ierr = PetscFree(obj->intcomposeddata);CHKERRQ(ierr); 38d42688cbSBarry Smith ierr = PetscFree(obj->intcomposedstate);CHKERRQ(ierr); 39d42688cbSBarry Smith ierr = PetscFree(obj->realcomposeddata);CHKERRQ(ierr); 40d42688cbSBarry Smith ierr = PetscFree(obj->realcomposedstate);CHKERRQ(ierr); 41d42688cbSBarry Smith ierr = PetscFree(obj->scalarcomposeddata);CHKERRQ(ierr); 42d42688cbSBarry Smith ierr = PetscFree(obj->scalarcomposedstate);CHKERRQ(ierr); 43b436f76fSVictor Eijkhout PetscFunctionReturn(0); 44b436f76fSVictor Eijkhout } 45b436f76fSVictor Eijkhout 46e5c89e4eSSatish Balay #undef __FUNCT__ 47e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDestroy" 48e30d2299SSatish Balay /*@ 49e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 50e5c89e4eSSatish Balay 51e5c89e4eSSatish Balay Collective on PetscObject 52e5c89e4eSSatish Balay 53e5c89e4eSSatish Balay Input Parameter: 54e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 55fcfd50ebSBarry Smith This must be cast with a (PetscObject*), for example, 56fcfd50ebSBarry Smith PetscObjectDestroy((PetscObject*)&mat); 57e5c89e4eSSatish Balay 58e5c89e4eSSatish Balay Level: beginner 59e5c89e4eSSatish Balay 60e5c89e4eSSatish Balay Concepts: destroying object 61e5c89e4eSSatish Balay Concepts: freeing object 62e5c89e4eSSatish Balay Concepts: deleting object 63e5c89e4eSSatish Balay 64e5c89e4eSSatish Balay @*/ 65fcfd50ebSBarry Smith PetscErrorCode PetscObjectDestroy(PetscObject *obj) 66e5c89e4eSSatish Balay { 67e5c89e4eSSatish Balay PetscErrorCode ierr; 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay PetscFunctionBegin; 706bf464f9SBarry Smith if (!*obj) PetscFunctionReturn(0); 716bf464f9SBarry Smith PetscValidHeader(*obj,1); 72fcfd50ebSBarry Smith if (*obj && (*obj)->bops->destroy) { 73fcfd50ebSBarry Smith ierr = (*(*obj)->bops->destroy)(obj);CHKERRQ(ierr); 746bf464f9SBarry 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); 75e5c89e4eSSatish Balay PetscFunctionReturn(0); 76e5c89e4eSSatish Balay } 77e5c89e4eSSatish Balay 78e5c89e4eSSatish Balay #undef __FUNCT__ 79e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectView" 80e5c89e4eSSatish Balay /*@C 81e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 82e5c89e4eSSatish Balay 83e5c89e4eSSatish Balay Collective on PetscObject 84e5c89e4eSSatish Balay 85e5c89e4eSSatish Balay Input Parameters: 86e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 87e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 88e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 89e5c89e4eSSatish Balay - viewer - any PETSc viewer 90e5c89e4eSSatish Balay 91e5c89e4eSSatish Balay Level: intermediate 92e5c89e4eSSatish Balay 93e5c89e4eSSatish Balay @*/ 947087cfbeSBarry Smith PetscErrorCode PetscObjectView(PetscObject obj,PetscViewer viewer) 95e5c89e4eSSatish Balay { 96e5c89e4eSSatish Balay PetscErrorCode ierr; 97e5c89e4eSSatish Balay 98e5c89e4eSSatish Balay PetscFunctionBegin; 99e5c89e4eSSatish Balay PetscValidHeader(obj,1); 1003050cee2SBarry Smith if (!viewer) { 1013050cee2SBarry Smith ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 1023050cee2SBarry Smith } 1030700a824SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 104e5c89e4eSSatish Balay 105e5c89e4eSSatish Balay if (obj->bops->view) { 106e5c89e4eSSatish Balay ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 107*f23aa3ddSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 108e5c89e4eSSatish Balay PetscFunctionReturn(0); 109e5c89e4eSSatish Balay } 110e5c89e4eSSatish Balay 111e5c89e4eSSatish Balay #undef __FUNCT__ 112251f4c67SDmitry Karpeev #define __FUNCT__ "PetscObjectTypeCompare" 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 129e5c89e4eSSatish Balay .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType() 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay Concepts: comparing^object types 132e5c89e4eSSatish Balay Concepts: types^comparing 133251f4c67SDmitry Karpeev Concepts: object type^comparpeing 134e5c89e4eSSatish Balay 135e5c89e4eSSatish Balay @*/ 136251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompare(PetscObject obj,const char type_name[],PetscBool *same) 137e5c89e4eSSatish Balay { 138e5c89e4eSSatish Balay PetscErrorCode ierr; 139e5c89e4eSSatish Balay 140e5c89e4eSSatish Balay PetscFunctionBegin; 141e5c89e4eSSatish Balay if (!obj) { 142e5c89e4eSSatish Balay *same = PETSC_FALSE; 143e5c89e4eSSatish Balay } else if (!type_name && !obj->type_name) { 144e5c89e4eSSatish Balay *same = PETSC_TRUE; 145e5c89e4eSSatish Balay } else if (!type_name || !obj->type_name) { 146e5c89e4eSSatish Balay *same = PETSC_FALSE; 147e5c89e4eSSatish Balay } else { 148e5c89e4eSSatish Balay PetscValidHeader(obj,1); 149e5c89e4eSSatish Balay PetscValidCharPointer(type_name,2); 150e5c89e4eSSatish Balay PetscValidPointer(same,3); 151e5c89e4eSSatish Balay ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 152e5c89e4eSSatish Balay } 153e5c89e4eSSatish Balay PetscFunctionReturn(0); 154e5c89e4eSSatish Balay } 155e5c89e4eSSatish Balay 1562b12f010SJed Brown #undef __FUNCT__ 157251f4c67SDmitry Karpeev #define __FUNCT__ "PetscObjectTypeCompareAny" 1582b12f010SJed Brown /*@C 159251f4c67SDmitry Karpeev PetscObjectTypeCompareAny - Determines whether a PETSc object is of any of a list of types. 1602b12f010SJed Brown 1612b12f010SJed Brown Not Collective 1622b12f010SJed Brown 1632b12f010SJed Brown Input Parameters: 1642b12f010SJed Brown + obj - any PETSc object, for example a Vec, Mat or KSP. 165251f4c67SDmitry Karpeev This must be cast with a (PetscObject), for example, PetscObjectTypeCompareAny((PetscObject)mat,...); 1662b12f010SJed Brown - type_name - string containing a type name, pass the empty string "" to terminate the list 1672b12f010SJed Brown 1682b12f010SJed Brown Output Parameter: 1692b12f010SJed Brown . match - PETSC_TRUE if the type of obj matches any in the list, else PETSC_FALSE 1702b12f010SJed Brown 1712b12f010SJed Brown Level: intermediate 1722b12f010SJed Brown 173251f4c67SDmitry Karpeev .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType(), PetscObjectTypeCompare() 1742b12f010SJed Brown 1752b12f010SJed Brown Concepts: comparing^object types 1762b12f010SJed Brown Concepts: types^comparing 1772b12f010SJed Brown Concepts: object type^comparing 1782b12f010SJed Brown 1792b12f010SJed Brown @*/ 180251f4c67SDmitry Karpeev PetscErrorCode PetscObjectTypeCompareAny(PetscObject obj,PetscBool *match,const char type_name[],...) 1812b12f010SJed Brown { 1822b12f010SJed Brown PetscErrorCode ierr; 1832b12f010SJed Brown va_list Argp; 1842b12f010SJed Brown 1852b12f010SJed Brown PetscFunctionBegin; 1862b12f010SJed Brown *match = PETSC_FALSE; 1872b12f010SJed Brown va_start(Argp,type_name); 1882b12f010SJed Brown while (type_name && type_name[0]) { 1892b12f010SJed Brown PetscBool found; 190251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare(obj,type_name,&found);CHKERRQ(ierr); 1912b12f010SJed Brown if (found) { 1922b12f010SJed Brown *match = PETSC_TRUE; 1932b12f010SJed Brown break; 1942b12f010SJed Brown } 1952b12f010SJed Brown type_name = va_arg(Argp,const char*); 1962b12f010SJed Brown } 1972b12f010SJed Brown va_end(Argp); 1982b12f010SJed Brown PetscFunctionReturn(0); 1992b12f010SJed Brown } 2002b12f010SJed Brown 2013cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 202e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2033cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 204e5c89e4eSSatish Balay 205e5c89e4eSSatish Balay #undef __FUNCT__ 206e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroy" 207e5c89e4eSSatish Balay /*@C 208e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 209e5c89e4eSSatish Balay PetscFinalize() is called. 210e5c89e4eSSatish Balay 2113f9fe445SBarry Smith Logically Collective on PetscObject 212e5c89e4eSSatish Balay 213e5c89e4eSSatish Balay Input Parameter: 214e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 215e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 216e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay Level: developer 219e5c89e4eSSatish Balay 220e5c89e4eSSatish Balay Notes: 221e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 222e5c89e4eSSatish Balay when PETSc ends. 223e5c89e4eSSatish Balay 224e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll() 225e5c89e4eSSatish Balay @*/ 2267087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) 227e5c89e4eSSatish Balay { 228e5c89e4eSSatish Balay PetscFunctionBegin; 229e5c89e4eSSatish Balay PetscValidHeader(obj,1); 2303cfa8680SLisandro Dalcin if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) { 231e5c89e4eSSatish Balay PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 2328c74ee41SBarry Smith } 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); 233e5c89e4eSSatish Balay PetscFunctionReturn(0); 234e5c89e4eSSatish Balay } 235e5c89e4eSSatish Balay 236e5c89e4eSSatish Balay #undef __FUNCT__ 237e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroyAll" 238e5c89e4eSSatish Balay /*@C 239e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 240e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 241e5c89e4eSSatish Balay 2423f9fe445SBarry Smith Logically Collective on individual PetscObjects 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay Level: developer 245e5c89e4eSSatish Balay 246e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy() 247e5c89e4eSSatish Balay @*/ 2487087cfbeSBarry Smith PetscErrorCode PetscObjectRegisterDestroyAll(void) 249e5c89e4eSSatish Balay { 250e5c89e4eSSatish Balay PetscErrorCode ierr; 2518c74ee41SBarry Smith PetscInt i; 252e5c89e4eSSatish Balay 253e5c89e4eSSatish Balay PetscFunctionBegin; 254e5c89e4eSSatish Balay for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 255fcfd50ebSBarry Smith ierr = PetscObjectDestroy(&PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 256e5c89e4eSSatish Balay } 2573cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 258e5c89e4eSSatish Balay PetscFunctionReturn(0); 259e5c89e4eSSatish Balay } 260e5c89e4eSSatish Balay 261e5c89e4eSSatish Balay 262eb8be38cSBarry Smith #define MAXREGFIN 256 263eb8be38cSBarry Smith static int PetscRegisterFinalize_Count = 0; 264eb8be38cSBarry Smith static PetscErrorCode ((*PetscRegisterFinalize_Functions[MAXREGFIN])(void)); 265eb8be38cSBarry Smith 266eb8be38cSBarry Smith #undef __FUNCT__ 267eb8be38cSBarry Smith #define __FUNCT__ "PetscRegisterFinalize" 268eb8be38cSBarry Smith /*@C 269eb8be38cSBarry Smith PetscRegisterFinalize - Registers a function that is to be called in PetscFinalize() 270eb8be38cSBarry Smith 271eb8be38cSBarry Smith Not Collective 272eb8be38cSBarry Smith 273eb8be38cSBarry Smith Input Parameter: 274eb8be38cSBarry Smith . PetscErrorCode (*fun)(void) - 275eb8be38cSBarry Smith 276eb8be38cSBarry Smith Level: developer 277eb8be38cSBarry Smith 278eb8be38cSBarry Smith Notes: 2792390153bSJed Brown This is used by, for example, DMInitializePackage() to have DMFinalizePackage() called 280eb8be38cSBarry Smith 281eb8be38cSBarry Smith .seealso: PetscRegisterFinalizeAll() 282eb8be38cSBarry Smith @*/ 2837087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalize(PetscErrorCode (*f)(void)) 284eb8be38cSBarry Smith { 285f4aac215SBarry Smith PetscInt i; 286eb8be38cSBarry Smith 287f4aac215SBarry Smith PetscFunctionBegin; 288f4aac215SBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 289f4aac215SBarry Smith if (f == PetscRegisterFinalize_Functions[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Called twice with same function to register"); 290f4aac215SBarry Smith } 291eb8be38cSBarry Smith if (PetscRegisterFinalize_Count < MAXREGFIN) { 292eb8be38cSBarry Smith PetscRegisterFinalize_Functions[PetscRegisterFinalize_Count++] = f; 2938c74ee41SBarry Smith } 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); 294eb8be38cSBarry Smith PetscFunctionReturn(0); 295eb8be38cSBarry Smith } 296eb8be38cSBarry Smith 297eb8be38cSBarry Smith #undef __FUNCT__ 29853c77d0aSJed Brown #define __FUNCT__ "PetscRegisterFinalizeAll" 299eb8be38cSBarry Smith /*@C 300eb8be38cSBarry Smith PetscRegisterFinalizeAll - Runs all the finalize functions set with PetscRegisterFinalize() 301eb8be38cSBarry Smith 302eb8be38cSBarry Smith Not Collective unless registered functions are collective 303eb8be38cSBarry Smith 304eb8be38cSBarry Smith Level: developer 305eb8be38cSBarry Smith 306eb8be38cSBarry Smith .seealso: PetscRegisterFinalize() 307eb8be38cSBarry Smith @*/ 3087087cfbeSBarry Smith PetscErrorCode PetscRegisterFinalizeAll(void) 309eb8be38cSBarry Smith { 310eb8be38cSBarry Smith PetscErrorCode ierr; 3118c74ee41SBarry Smith PetscInt i; 312eb8be38cSBarry Smith 313eb8be38cSBarry Smith PetscFunctionBegin; 314eb8be38cSBarry Smith for (i=0; i<PetscRegisterFinalize_Count; i++) { 315eb8be38cSBarry Smith ierr = (*PetscRegisterFinalize_Functions[i])();CHKERRQ(ierr); 316eb8be38cSBarry Smith } 317eb8be38cSBarry Smith PetscRegisterFinalize_Count = 0; 318eb8be38cSBarry Smith PetscFunctionReturn(0); 319eb8be38cSBarry Smith } 320