1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5e5c89e4eSSatish Balay #include "petsc.h" /*I "petsc.h" I*/ 6e5c89e4eSSatish Balay 7*7adad957SLisandro Dalcin typedef struct _p_GenericObject* GenericObject; 8*7adad957SLisandro Dalcin 9*7adad957SLisandro Dalcin struct _p_GenericObject { 10e5c89e4eSSatish Balay PETSCHEADER(int); 11e5c89e4eSSatish Balay }; 12e5c89e4eSSatish Balay 13*7adad957SLisandro Dalcin PetscErrorCode PetscObjectDestroy_GenericObject(GenericObject obj) 14e5c89e4eSSatish Balay { 15d63b26baSBarry Smith PetscErrorCode ierr; 16d63b26baSBarry Smith PetscFunctionBegin; 17d63b26baSBarry Smith PetscValidHeader(obj,1); 18*7adad957SLisandro Dalcin if (--((PetscObject)obj)->refct > 0) PetscFunctionReturn(0); 19d63b26baSBarry Smith ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr); 20d63b26baSBarry Smith PetscFunctionReturn(0); 21e5c89e4eSSatish Balay } 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay #undef __FUNCT__ 24e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCreate" 25e5c89e4eSSatish Balay /*@C 26e5c89e4eSSatish Balay PetscObjectCreate - Creates a PetscObject 27e5c89e4eSSatish Balay 28e5c89e4eSSatish Balay Collective on PetscObject 29e5c89e4eSSatish Balay 30e5c89e4eSSatish Balay Input Parameter: 31e5c89e4eSSatish Balay . comm - An MPI communicator 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay Output Parameter: 34e5c89e4eSSatish Balay . obj - The object 35e5c89e4eSSatish Balay 36d63b26baSBarry Smith Level: developer 37d63b26baSBarry Smith 38*7adad957SLisandro Dalcin Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_GenericObject() 39d63b26baSBarry Smith to make new object classes. 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay Concepts: destroying object 42e5c89e4eSSatish Balay Concepts: freeing object 43e5c89e4eSSatish Balay Concepts: deleting object 44e5c89e4eSSatish Balay 45e5c89e4eSSatish Balay @*/ 46e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm comm, PetscObject *obj) 47e5c89e4eSSatish Balay { 48*7adad957SLisandro Dalcin GenericObject o; 49e5c89e4eSSatish Balay PetscErrorCode ierr; 50e5c89e4eSSatish Balay 51e5c89e4eSSatish Balay PetscFunctionBegin; 52e5c89e4eSSatish Balay PetscValidPointer(obj,2); 53e5c89e4eSSatish Balay #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 54e5c89e4eSSatish Balay ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr); 55e5c89e4eSSatish Balay #endif 56*7adad957SLisandro Dalcin ierr = PetscHeaderCreate(o,_p_GenericObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_GenericObject,0);CHKERRQ(ierr); 57e5c89e4eSSatish Balay /* records not yet defined in PetscObject 58e5c89e4eSSatish Balay o->data = 0; 59e5c89e4eSSatish Balay o->setupcalled = 0; 60e5c89e4eSSatish Balay */ 61*7adad957SLisandro Dalcin *obj = (PetscObject)o; 62e5c89e4eSSatish Balay PetscFunctionReturn(0); 63e5c89e4eSSatish Balay } 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay #undef __FUNCT__ 66f86e92e0SMatthew Knepley #define __FUNCT__ "PetscObjectCreateGeneric" 67f86e92e0SMatthew Knepley /*@C 68f86e92e0SMatthew Knepley PetscObjectCreateGeneric - Creates a PetscObject 69f86e92e0SMatthew Knepley 70f86e92e0SMatthew Knepley Collective on PetscObject 71f86e92e0SMatthew Knepley 72f86e92e0SMatthew Knepley Input Parameter: 73f86e92e0SMatthew Knepley + comm - An MPI communicator 74f86e92e0SMatthew Knepley . cookie - The class cookie 75f86e92e0SMatthew Knepley - name - The class name 76f86e92e0SMatthew Knepley 77f86e92e0SMatthew Knepley Output Parameter: 78f86e92e0SMatthew Knepley . obj - The object 79f86e92e0SMatthew Knepley 80f86e92e0SMatthew Knepley Level: developer 81f86e92e0SMatthew Knepley 82*7adad957SLisandro Dalcin Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_GenericObject() 83f86e92e0SMatthew Knepley to make new object classes. 84f86e92e0SMatthew Knepley 85f86e92e0SMatthew Knepley Concepts: destroying object 86f86e92e0SMatthew Knepley Concepts: freeing object 87f86e92e0SMatthew Knepley Concepts: deleting object 88f86e92e0SMatthew Knepley 89f86e92e0SMatthew Knepley @*/ 90f86e92e0SMatthew Knepley PetscErrorCode PETSC_DLLEXPORT PetscObjectCreateGeneric(MPI_Comm comm, PetscCookie cookie, const char name[], PetscObject *obj) 91f86e92e0SMatthew Knepley { 92*7adad957SLisandro Dalcin GenericObject o; 93f86e92e0SMatthew Knepley PetscErrorCode ierr; 94f86e92e0SMatthew Knepley 95f86e92e0SMatthew Knepley PetscFunctionBegin; 96f86e92e0SMatthew Knepley PetscValidPointer(obj,2); 97f86e92e0SMatthew Knepley #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 98f86e92e0SMatthew Knepley ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr); 99f86e92e0SMatthew Knepley #endif 100*7adad957SLisandro Dalcin ierr = PetscHeaderCreate(o,_p_GenericObject,-1,cookie,0,name,comm,PetscObjectDestroy_GenericObject,0);CHKERRQ(ierr); 101f86e92e0SMatthew Knepley /* records not yet defined in PetscObject 102f86e92e0SMatthew Knepley o->data = 0; 103f86e92e0SMatthew Knepley o->setupcalled = 0; 104f86e92e0SMatthew Knepley */ 105*7adad957SLisandro Dalcin *obj = (PetscObject)o; 106f86e92e0SMatthew Knepley PetscFunctionReturn(0); 107f86e92e0SMatthew Knepley } 108f86e92e0SMatthew Knepley 109f86e92e0SMatthew Knepley #undef __FUNCT__ 110e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDestroy" 111e30d2299SSatish Balay /*@ 112e5c89e4eSSatish Balay PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 113e5c89e4eSSatish Balay 114e5c89e4eSSatish Balay Collective on PetscObject 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay Input Parameter: 117e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 118e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 119e5c89e4eSSatish Balay PetscObjectDestroy((PetscObject)mat); 120e5c89e4eSSatish Balay 121e5c89e4eSSatish Balay Level: beginner 122e5c89e4eSSatish Balay 123e5c89e4eSSatish Balay Concepts: destroying object 124e5c89e4eSSatish Balay Concepts: freeing object 125e5c89e4eSSatish Balay Concepts: deleting object 126e5c89e4eSSatish Balay 127e5c89e4eSSatish Balay @*/ 128e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj) 129e5c89e4eSSatish Balay { 130e5c89e4eSSatish Balay PetscErrorCode ierr; 131e5c89e4eSSatish Balay 132e5c89e4eSSatish Balay PetscFunctionBegin; 133e5c89e4eSSatish Balay PetscValidHeader(obj,1); 134e5c89e4eSSatish Balay if (obj->bops->destroy) { 135e5c89e4eSSatish Balay ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr); 136e5c89e4eSSatish Balay } else { 137e5c89e4eSSatish Balay SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name); 138e5c89e4eSSatish Balay } 139e5c89e4eSSatish Balay PetscFunctionReturn(0); 140e5c89e4eSSatish Balay } 141e5c89e4eSSatish Balay 142e5c89e4eSSatish Balay #undef __FUNCT__ 143e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectView" 144e5c89e4eSSatish Balay /*@C 145e5c89e4eSSatish Balay PetscObjectView - Views any PetscObject, regardless of the type. 146e5c89e4eSSatish Balay 147e5c89e4eSSatish Balay Collective on PetscObject 148e5c89e4eSSatish Balay 149e5c89e4eSSatish Balay Input Parameters: 150e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 151e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 152e5c89e4eSSatish Balay PetscObjectView((PetscObject)mat,viewer); 153e5c89e4eSSatish Balay - viewer - any PETSc viewer 154e5c89e4eSSatish Balay 155e5c89e4eSSatish Balay Level: intermediate 156e5c89e4eSSatish Balay 157e5c89e4eSSatish Balay @*/ 158e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer) 159e5c89e4eSSatish Balay { 160e5c89e4eSSatish Balay PetscErrorCode ierr; 161e5c89e4eSSatish Balay 162e5c89e4eSSatish Balay PetscFunctionBegin; 163e5c89e4eSSatish Balay PetscValidHeader(obj,1); 1643050cee2SBarry Smith if (!viewer) { 1653050cee2SBarry Smith ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 1663050cee2SBarry Smith } 167e5c89e4eSSatish Balay PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); 168e5c89e4eSSatish Balay 169e5c89e4eSSatish Balay if (obj->bops->view) { 170e5c89e4eSSatish Balay ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 171e5c89e4eSSatish Balay } else { 172e5c89e4eSSatish Balay SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 173e5c89e4eSSatish Balay } 174e5c89e4eSSatish Balay PetscFunctionReturn(0); 175e5c89e4eSSatish Balay } 176e5c89e4eSSatish Balay 177e5c89e4eSSatish Balay #undef __FUNCT__ 178e5c89e4eSSatish Balay #define __FUNCT__ "PetscTypeCompare" 179e5c89e4eSSatish Balay /*@C 180e5c89e4eSSatish Balay PetscTypeCompare - Determines whether a PETSc object is of a particular type. 181e5c89e4eSSatish Balay 182e5c89e4eSSatish Balay Not Collective 183e5c89e4eSSatish Balay 184e5c89e4eSSatish Balay Input Parameters: 185e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. 186e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 187e5c89e4eSSatish Balay PetscObjectDestroy((PetscObject)mat); 188e5c89e4eSSatish Balay - type_name - string containing a type name 189e5c89e4eSSatish Balay 190e5c89e4eSSatish Balay Output Parameter: 191e5c89e4eSSatish Balay . same - PETSC_TRUE if they are the same, else PETSC_FALSE 192e5c89e4eSSatish Balay 193e5c89e4eSSatish Balay Level: intermediate 194e5c89e4eSSatish Balay 195e5c89e4eSSatish Balay .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType() 196e5c89e4eSSatish Balay 197e5c89e4eSSatish Balay Concepts: comparing^object types 198e5c89e4eSSatish Balay Concepts: types^comparing 199e5c89e4eSSatish Balay Concepts: object type^comparing 200e5c89e4eSSatish Balay 201e5c89e4eSSatish Balay @*/ 202e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same) 203e5c89e4eSSatish Balay { 204e5c89e4eSSatish Balay PetscErrorCode ierr; 205e5c89e4eSSatish Balay 206e5c89e4eSSatish Balay PetscFunctionBegin; 207e5c89e4eSSatish Balay if (!obj) { 208e5c89e4eSSatish Balay *same = PETSC_FALSE; 209e5c89e4eSSatish Balay } else if (!type_name && !obj->type_name) { 210e5c89e4eSSatish Balay *same = PETSC_TRUE; 211e5c89e4eSSatish Balay } else if (!type_name || !obj->type_name) { 212e5c89e4eSSatish Balay *same = PETSC_FALSE; 213e5c89e4eSSatish Balay } else { 214e5c89e4eSSatish Balay PetscValidHeader(obj,1); 215e5c89e4eSSatish Balay PetscValidCharPointer(type_name,2); 216e5c89e4eSSatish Balay PetscValidPointer(same,3); 217e5c89e4eSSatish Balay ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 218e5c89e4eSSatish Balay } 219e5c89e4eSSatish Balay PetscFunctionReturn(0); 220e5c89e4eSSatish Balay } 221e5c89e4eSSatish Balay 2223cfa8680SLisandro Dalcin #define MAXREGDESOBJS 256 223e5c89e4eSSatish Balay static int PetscObjectRegisterDestroy_Count = 0; 2243cfa8680SLisandro Dalcin static PetscObject PetscObjectRegisterDestroy_Objects[MAXREGDESOBJS]; 225e5c89e4eSSatish Balay 226e5c89e4eSSatish Balay #undef __FUNCT__ 227e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroy" 228e5c89e4eSSatish Balay /*@C 229e5c89e4eSSatish Balay PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 230e5c89e4eSSatish Balay PetscFinalize() is called. 231e5c89e4eSSatish Balay 232e5c89e4eSSatish Balay Collective on PetscObject 233e5c89e4eSSatish Balay 234e5c89e4eSSatish Balay Input Parameter: 235e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. 236e5c89e4eSSatish Balay This must be cast with a (PetscObject), for example, 237e5c89e4eSSatish Balay PetscObjectRegisterDestroy((PetscObject)mat); 238e5c89e4eSSatish Balay 239e5c89e4eSSatish Balay Level: developer 240e5c89e4eSSatish Balay 241e5c89e4eSSatish Balay Notes: 242e5c89e4eSSatish Balay This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 243e5c89e4eSSatish Balay when PETSc ends. 244e5c89e4eSSatish Balay 245e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroyAll() 246e5c89e4eSSatish Balay @*/ 247e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj) 248e5c89e4eSSatish Balay { 249e5c89e4eSSatish Balay PetscFunctionBegin; 250e5c89e4eSSatish Balay PetscValidHeader(obj,1); 2513cfa8680SLisandro Dalcin if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) { 252e5c89e4eSSatish Balay PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 2533cfa8680SLisandro Dalcin } else { 2543cfa8680SLisandro Dalcin SETERRQ1(PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGDESOBJS\n",MAXREGDESOBJS); 2553cfa8680SLisandro Dalcin 2563cfa8680SLisandro Dalcin } 257e5c89e4eSSatish Balay PetscFunctionReturn(0); 258e5c89e4eSSatish Balay } 259e5c89e4eSSatish Balay 260e5c89e4eSSatish Balay #undef __FUNCT__ 261e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectRegisterDestroyAll" 262e5c89e4eSSatish Balay /*@C 263e5c89e4eSSatish Balay PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 264e5c89e4eSSatish Balay with PetscObjectRegisterDestroy(). Called by PetscFinalize() 265e5c89e4eSSatish Balay 266e5c89e4eSSatish Balay Collective on individual PetscObjects 267e5c89e4eSSatish Balay 268e5c89e4eSSatish Balay Level: developer 269e5c89e4eSSatish Balay 270e5c89e4eSSatish Balay .seealso: PetscObjectRegisterDestroy() 271e5c89e4eSSatish Balay @*/ 272e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void) 273e5c89e4eSSatish Balay { 274e5c89e4eSSatish Balay PetscErrorCode ierr; 275e5c89e4eSSatish Balay int i; 276e5c89e4eSSatish Balay 277e5c89e4eSSatish Balay PetscFunctionBegin; 278e5c89e4eSSatish Balay for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 279e5c89e4eSSatish Balay ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 280e5c89e4eSSatish Balay } 2813cfa8680SLisandro Dalcin PetscObjectRegisterDestroy_Count = 0; 282e5c89e4eSSatish Balay PetscFunctionReturn(0); 283e5c89e4eSSatish Balay } 284e5c89e4eSSatish Balay 285e5c89e4eSSatish Balay 286