1 /* 2 Objects to manage the interactions between the mesh data structures and the algebraic objects 3 */ 4 #if !defined(__PETSCDM_H) 5 #define __PETSCDM_H 6 #include "petscmat.h" 7 PETSC_EXTERN_CXX_BEGIN 8 9 extern PetscErrorCode DMInitializePackage(const char[]); 10 /*S 11 DM - Abstract PETSc object that manages an abstract grid object 12 13 Level: intermediate 14 15 Concepts: grids, grid refinement 16 17 Notes: The DMDACreate() based object and the DMCompositeCreate() based object are examples of DMs 18 19 Though the DM objects require the petscsnes.h include files the DM library is 20 NOT dependent on the SNES or KSP library. In fact, the KSP and SNES libraries depend on 21 DM. (This is not great design, but not trivial to fix). 22 23 .seealso: DMCompositeCreate(), DMDACreate() 24 S*/ 25 typedef struct _p_DM* DM; 26 27 extern PetscClassId DM_CLASSID; 28 29 /*J 30 DMType - String with the name of a PETSc DM or the creation function 31 with an optional dynamic library name, for example 32 http://www.mcs.anl.gov/petsc/lib.a:myveccreate() 33 34 Level: beginner 35 36 .seealso: DMSetType(), DM 37 J*/ 38 #define DMType char* 39 #define DMDA "da" 40 #define DMADDA "adda" 41 #define DMCOMPOSITE "composite" 42 #define DMSLICED "sliced" 43 #define DMSHELL "shell" 44 #define DMMESH "mesh" 45 #define DMCOMPLEX "complex" 46 #define DMCARTESIAN "cartesian" 47 #define DMIGA "iga" 48 #define DMREDUNDANT "redundant" 49 #define DMAKKT "akkt" 50 51 extern PetscFList DMList; 52 extern PetscBool DMRegisterAllCalled; 53 extern PetscErrorCode DMCreate(MPI_Comm,DM*); 54 extern PetscErrorCode DMSetType(DM, const DMType); 55 extern PetscErrorCode DMGetType(DM, const DMType *); 56 extern PetscErrorCode DMRegister(const char[],const char[],const char[],PetscErrorCode (*)(DM)); 57 extern PetscErrorCode DMRegisterAll(const char []); 58 extern PetscErrorCode DMRegisterDestroy(void); 59 60 61 /*MC 62 DMRegisterDynamic - Adds a new DM component implementation 63 64 Synopsis: 65 PetscErrorCode DMRegisterDynamic(const char *name,const char *path,const char *func_name, PetscErrorCode (*create_func)(DM)) 66 67 Not Collective 68 69 Input Parameters: 70 + name - The name of a new user-defined creation routine 71 . path - The path (either absolute or relative) of the library containing this routine 72 . func_name - The name of routine to create method context 73 - create_func - The creation routine itself 74 75 Notes: 76 DMRegisterDynamic() may be called multiple times to add several user-defined DMs 77 78 If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 79 80 Sample usage: 81 .vb 82 DMRegisterDynamic("my_da","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyDMCreate", MyDMCreate); 83 .ve 84 85 Then, your DM type can be chosen with the procedural interface via 86 .vb 87 DMCreate(MPI_Comm, DM *); 88 DMSetType(DM,"my_da_name"); 89 .ve 90 or at runtime via the option 91 .vb 92 -da_type my_da_name 93 .ve 94 95 Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 96 If your function is not being put into a shared library then use DMRegister() instead 97 98 Level: advanced 99 100 .keywords: DM, register 101 .seealso: DMRegisterAll(), DMRegisterDestroy(), DMRegister() 102 M*/ 103 #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 104 #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,0) 105 #else 106 #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,d) 107 #endif 108 109 extern PetscErrorCode DMView(DM,PetscViewer); 110 extern PetscErrorCode DMLoad(DM,PetscViewer); 111 extern PetscErrorCode DMDestroy(DM*); 112 extern PetscErrorCode DMCreateGlobalVector(DM,Vec*); 113 extern PetscErrorCode DMCreateLocalVector(DM,Vec*); 114 extern PetscErrorCode DMGetLocalVector(DM,Vec *); 115 extern PetscErrorCode DMRestoreLocalVector(DM,Vec *); 116 extern PetscErrorCode DMGetGlobalVector(DM,Vec *); 117 extern PetscErrorCode DMRestoreGlobalVector(DM,Vec *); 118 extern PetscErrorCode DMClearGlobalVectors(DM); 119 extern PetscErrorCode DMGetNamedGlobalVector(DM,const char*,Vec*); 120 extern PetscErrorCode DMRestoreNamedGlobalVector(DM,const char*,Vec*); 121 extern PetscErrorCode DMGetLocalToGlobalMapping(DM,ISLocalToGlobalMapping*); 122 extern PetscErrorCode DMGetLocalToGlobalMappingBlock(DM,ISLocalToGlobalMapping*); 123 extern PetscErrorCode DMCreateFieldIS(DM,PetscInt*,char***,IS**); 124 extern PetscErrorCode DMGetBlockSize(DM,PetscInt*); 125 extern PetscErrorCode DMCreateColoring(DM,ISColoringType,const MatType,ISColoring*); 126 extern PetscErrorCode DMCreateMatrix(DM,const MatType,Mat*); 127 extern PetscErrorCode DMSetMatrixPreallocateOnly(DM,PetscBool); 128 extern PetscErrorCode DMCreateInterpolation(DM,DM,Mat*,Vec*); 129 extern PetscErrorCode DMCreateInjection(DM,DM,VecScatter*); 130 extern PetscErrorCode DMGetWorkArray(DM,PetscInt,PetscScalar**); 131 extern PetscErrorCode DMRefine(DM,MPI_Comm,DM*); 132 extern PetscErrorCode DMCoarsen(DM,MPI_Comm,DM*); 133 extern PetscErrorCode DMRefineHierarchy(DM,PetscInt,DM[]); 134 extern PetscErrorCode DMCoarsenHierarchy(DM,PetscInt,DM[]); 135 extern PetscErrorCode DMCoarsenHookAdd(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,Vec,Mat,DM,void*),void*); 136 extern PetscErrorCode DMRefineHookAdd(DM,PetscErrorCode (*)(DM,DM,void*),PetscErrorCode (*)(DM,Mat,DM,void*),void*); 137 extern PetscErrorCode DMRestrict(DM,Mat,Vec,Mat,DM); 138 extern PetscErrorCode DMInterpolate(DM,Mat,DM); 139 extern PetscErrorCode DMSetFromOptions(DM); 140 extern PetscErrorCode DMSetUp(DM); 141 extern PetscErrorCode DMCreateInterpolationScale(DM,DM,Mat,Vec*); 142 extern PetscErrorCode DMCreateAggregates(DM,DM,Mat*); 143 extern PetscErrorCode DMGlobalToLocalBegin(DM,Vec,InsertMode,Vec); 144 extern PetscErrorCode DMGlobalToLocalEnd(DM,Vec,InsertMode,Vec); 145 extern PetscErrorCode DMLocalToGlobalBegin(DM,Vec,InsertMode,Vec); 146 extern PetscErrorCode DMLocalToGlobalEnd(DM,Vec,InsertMode,Vec); 147 extern PetscErrorCode DMConvert(DM,const DMType,DM*); 148 149 extern PetscErrorCode DMSetOptionsPrefix(DM,const char []); 150 extern PetscErrorCode DMSetVecType(DM,const VecType); 151 extern PetscErrorCode DMSetMatType(DM,const MatType); 152 extern PetscErrorCode DMSetApplicationContext(DM,void*); 153 extern PetscErrorCode DMSetApplicationContextDestroy(DM,PetscErrorCode (*)(void**)); 154 extern PetscErrorCode DMGetApplicationContext(DM,void*); 155 extern PetscErrorCode DMSetInitialGuess(DM,PetscErrorCode (*)(DM,Vec)); 156 extern PetscErrorCode DMSetFunction(DM,PetscErrorCode (*)(DM,Vec,Vec)); 157 extern PetscErrorCode DMSetJacobian(DM,PetscErrorCode (*)(DM,Vec,Mat,Mat,MatStructure *)); 158 extern PetscErrorCode DMSetVariableBounds(DM,PetscErrorCode (*)(DM,Vec,Vec)); 159 extern PetscErrorCode DMHasInitialGuess(DM,PetscBool *); 160 extern PetscErrorCode DMHasFunction(DM,PetscBool *); 161 extern PetscErrorCode DMHasJacobian(DM,PetscBool *); 162 extern PetscErrorCode DMHasVariableBounds(DM,PetscBool *); 163 extern PetscErrorCode DMComputeInitialGuess(DM,Vec); 164 extern PetscErrorCode DMComputeFunction(DM,Vec,Vec); 165 extern PetscErrorCode DMComputeJacobian(DM,Vec,Mat,Mat,MatStructure *); 166 extern PetscErrorCode DMComputeJacobianDefault(DM,Vec,Mat,Mat,MatStructure *); 167 extern PetscErrorCode DMComputeVariableBounds(DM,Vec,Vec); 168 169 extern PetscErrorCode DMCreateDecompositionDM(DM,const char*,DM*); 170 extern PetscErrorCode DMCreateDecomposition(DM,PetscInt*,char***,IS**,DM**); 171 172 extern PetscErrorCode DMGetRefineLevel(DM,PetscInt*); 173 extern PetscErrorCode DMGetCoarsenLevel(DM,PetscInt*); 174 extern PetscErrorCode DMFinalizePackage(void); 175 176 typedef struct NLF_DAAD* NLF; 177 178 #include "petscbag.h" 179 180 extern PetscErrorCode PetscViewerBinaryMatlabOpen(MPI_Comm, const char [], PetscViewer*); 181 extern PetscErrorCode PetscViewerBinaryMatlabDestroy(PetscViewer*); 182 extern PetscErrorCode PetscViewerBinaryMatlabOutputBag(PetscViewer, const char [], PetscBag); 183 extern PetscErrorCode PetscViewerBinaryMatlabOutputVec(PetscViewer, const char [], Vec); 184 extern PetscErrorCode PetscViewerBinaryMatlabOutputVecDA(PetscViewer, const char [], Vec, DM); 185 186 #define DM_FILE_CLASSID 1211221 187 188 /* FEM support */ 189 extern PetscErrorCode DMGetLocalFunction(DM, PetscErrorCode (**)(DM, Vec, Vec, void *)); 190 extern PetscErrorCode DMSetLocalFunction(DM, PetscErrorCode (*)(DM, Vec, Vec, void *)); 191 extern PetscErrorCode DMGetLocalJacobian(DM, PetscErrorCode (**)(DM, Vec, Mat, Mat, void *)); 192 extern PetscErrorCode DMSetLocalJacobian(DM, PetscErrorCode (*)(DM, Vec, Mat, Mat, void *)); 193 typedef PetscErrorCode (*DMLocalFunction1)(DM, Vec, Vec, void*); 194 typedef PetscErrorCode (*DMLocalJacobian1)(DM, Vec, Mat, Mat, void*); 195 extern PetscErrorCode DMPrintCellVector(PetscInt, const char [], PetscInt, const PetscScalar []); 196 extern PetscErrorCode DMPrintCellMatrix(PetscInt, const char [], PetscInt, PetscInt, const PetscScalar []); 197 198 extern PetscErrorCode DMGetDefaultSection(DM, PetscSection *); 199 extern PetscErrorCode DMSetDefaultSection(DM, PetscSection); 200 extern PetscErrorCode DMGetDefaultGlobalSection(DM, PetscSection *); 201 extern PetscErrorCode DMGetDefaultSF(DM, PetscSF *); 202 extern PetscErrorCode DMSetDefaultSF(DM, PetscSF); 203 extern PetscErrorCode DMCreateDefaultSF(DM, PetscSection, PetscSection); 204 205 typedef struct { 206 PetscInt numQuadPoints; /* The number of quadrature points on an element */ 207 const PetscReal *quadPoints; /* The quadrature point coordinates */ 208 const PetscReal *quadWeights; /* The quadrature weights */ 209 PetscInt numBasisFuncs; /* The number of finite element basis functions on an element */ 210 PetscInt numComponents; /* The number of components for each basis function */ 211 const PetscReal *basis; /* The basis functions tabulated at the quadrature points */ 212 const PetscReal *basisDer; /* The basis function derivatives tabulated at the quadrature points */ 213 } PetscQuadrature; 214 PETSC_EXTERN_CXX_END 215 #endif 216