1 /* 2 Objects which encapsulate finite element spaces and operations 3 */ 4 #if !defined(__PETSCFE_H) 5 #define __PETSCFE_H 6 #include <petscdm.h> 7 #include <petscdt.h> 8 #include <petscfetypes.h> 9 10 PETSC_EXTERN PetscErrorCode PetscFEInitializePackage(void); 11 12 PETSC_EXTERN PetscClassId PETSCSPACE_CLASSID; 13 14 /*J 15 PetscSpaceType - String with the name of a PETSc linear space 16 17 Level: beginner 18 19 .seealso: PetscSpaceSetType(), PetscSpace 20 J*/ 21 typedef const char *PetscSpaceType; 22 #define PETSCSPACEPOLYNOMIAL "poly" 23 #define PETSCSPACEDG "dg" 24 25 PETSC_EXTERN PetscFunctionList PetscSpaceList; 26 PETSC_EXTERN PetscBool PetscSpaceRegisterAllCalled; 27 PETSC_EXTERN PetscErrorCode PetscSpaceCreate(MPI_Comm, PetscSpace *); 28 PETSC_EXTERN PetscErrorCode PetscSpaceDestroy(PetscSpace *); 29 PETSC_EXTERN PetscErrorCode PetscSpaceSetType(PetscSpace, PetscSpaceType); 30 PETSC_EXTERN PetscErrorCode PetscSpaceGetType(PetscSpace, PetscSpaceType *); 31 PETSC_EXTERN PetscErrorCode PetscSpaceSetUp(PetscSpace); 32 PETSC_EXTERN PetscErrorCode PetscSpaceSetFromOptions(PetscSpace); 33 PETSC_EXTERN PetscErrorCode PetscSpaceViewFromOptions(PetscSpace,const char[],const char[]); 34 PETSC_EXTERN PetscErrorCode PetscSpaceView(PetscSpace,PetscViewer); 35 PETSC_EXTERN PetscErrorCode PetscSpaceRegister(const char [], PetscErrorCode (*)(PetscSpace)); 36 PETSC_EXTERN PetscErrorCode PetscSpaceRegisterAll(void); 37 PETSC_EXTERN PetscErrorCode PetscSpaceRegisterDestroy(void); 38 39 PETSC_EXTERN PetscErrorCode PetscSpaceGetDimension(PetscSpace, PetscInt *); 40 PETSC_EXTERN PetscErrorCode PetscSpaceSetOrder(PetscSpace, PetscInt); 41 PETSC_EXTERN PetscErrorCode PetscSpaceGetOrder(PetscSpace, PetscInt *); 42 PETSC_EXTERN PetscErrorCode PetscSpaceEvaluate(PetscSpace, PetscInt, const PetscReal[], PetscReal[], PetscReal[], PetscReal[]); 43 44 PETSC_EXTERN PetscErrorCode PetscSpacePolynomialSetNumVariables(PetscSpace, PetscInt); 45 PETSC_EXTERN PetscErrorCode PetscSpacePolynomialGetNumVariables(PetscSpace, PetscInt *); 46 PETSC_EXTERN PetscErrorCode PetscSpacePolynomialSetSymmetric(PetscSpace, PetscBool); 47 PETSC_EXTERN PetscErrorCode PetscSpacePolynomialGetSymmetric(PetscSpace, PetscBool *); 48 49 PETSC_EXTERN PetscErrorCode PetscSpaceDGSetQuadrature(PetscSpace, PetscQuadrature); 50 PETSC_EXTERN PetscErrorCode PetscSpaceDGGetQuadrature(PetscSpace, PetscQuadrature *); 51 52 PETSC_EXTERN PetscClassId PETSCDUALSPACE_CLASSID; 53 54 /*J 55 PetscDualSpaceType - String with the name of a PETSc dual space 56 57 Level: beginner 58 59 .seealso: PetscDualSpaceSetType(), PetscDualSpace 60 J*/ 61 typedef const char *PetscDualSpaceType; 62 #define PETSCDUALSPACELAGRANGE "lagrange" 63 64 PETSC_EXTERN PetscFunctionList PetscDualSpaceList; 65 PETSC_EXTERN PetscBool PetscDualSpaceRegisterAllCalled; 66 PETSC_EXTERN PetscErrorCode PetscDualSpaceCreate(MPI_Comm, PetscDualSpace *); 67 PETSC_EXTERN PetscErrorCode PetscDualSpaceDestroy(PetscDualSpace *); 68 PETSC_EXTERN PetscErrorCode PetscDualSpaceSetType(PetscDualSpace, PetscDualSpaceType); 69 PETSC_EXTERN PetscErrorCode PetscDualSpaceGetType(PetscDualSpace, PetscDualSpaceType *); 70 PETSC_EXTERN PetscErrorCode PetscDualSpaceSetUp(PetscDualSpace); 71 PETSC_EXTERN PetscErrorCode PetscDualSpaceSetFromOptions(PetscDualSpace); 72 PETSC_EXTERN PetscErrorCode PetscDualSpaceViewFromOptions(PetscDualSpace,const char[],const char[]); 73 PETSC_EXTERN PetscErrorCode PetscDualSpaceView(PetscDualSpace,PetscViewer); 74 PETSC_EXTERN PetscErrorCode PetscDualSpaceRegister(const char [], PetscErrorCode (*)(PetscDualSpace)); 75 PETSC_EXTERN PetscErrorCode PetscDualSpaceRegisterAll(void); 76 PETSC_EXTERN PetscErrorCode PetscDualSpaceRegisterDestroy(void); 77 78 PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDimension(PetscDualSpace, PetscInt *); 79 PETSC_EXTERN PetscErrorCode PetscDualSpaceSetOrder(PetscDualSpace, PetscInt); 80 PETSC_EXTERN PetscErrorCode PetscDualSpaceGetOrder(PetscDualSpace, PetscInt *); 81 PETSC_EXTERN PetscErrorCode PetscDualSpaceSetDM(PetscDualSpace, DM); 82 PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDM(PetscDualSpace, DM *); 83 PETSC_EXTERN PetscErrorCode PetscDualSpaceGetFunctional(PetscDualSpace, PetscInt, PetscQuadrature *); 84 PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateReferenceCell(PetscDualSpace, PetscInt, PetscBool, DM *); 85 86 PETSC_EXTERN PetscErrorCode PetscDualSpaceApply(PetscDualSpace, PetscInt, PetscCellGeometry, PetscInt, void (*)(const PetscReal [], PetscScalar *, void *), void *, PetscScalar *); 87 88 PETSC_EXTERN PetscClassId PETSCFE_CLASSID; 89 90 /*J 91 PetscFEType - String with the name of a PETSc finite element space 92 93 Level: beginner 94 95 Note: Currently, the classes are concerned with the implementation of element integration 96 97 .seealso: PetscFESetType(), PetscFE 98 J*/ 99 typedef const char *PetscFEType; 100 #define PETSCFEBASIC "basic" 101 #define PETSCFENONAFFINE "nonaffine" 102 #define PETSCFEOPENCL "opencl" 103 104 PETSC_EXTERN PetscFunctionList PetscFEList; 105 PETSC_EXTERN PetscBool PetscFERegisterAllCalled; 106 PETSC_EXTERN PetscErrorCode PetscFECreate(MPI_Comm, PetscFE *); 107 PETSC_EXTERN PetscErrorCode PetscFEDestroy(PetscFE *); 108 PETSC_EXTERN PetscErrorCode PetscFESetType(PetscFE, PetscFEType); 109 PETSC_EXTERN PetscErrorCode PetscFEGetType(PetscFE, PetscFEType *); 110 PETSC_EXTERN PetscErrorCode PetscFESetUp(PetscFE); 111 PETSC_EXTERN PetscErrorCode PetscFESetFromOptions(PetscFE); 112 PETSC_EXTERN PetscErrorCode PetscFEViewFromOptions(PetscFE,const char[],const char[]); 113 PETSC_EXTERN PetscErrorCode PetscFEView(PetscFE,PetscViewer); 114 PETSC_EXTERN PetscErrorCode PetscFERegister(const char [], PetscErrorCode (*)(PetscFE)); 115 PETSC_EXTERN PetscErrorCode PetscFERegisterAll(void); 116 PETSC_EXTERN PetscErrorCode PetscFERegisterDestroy(void); 117 118 PETSC_EXTERN PetscErrorCode PetscFEGetDimension(PetscFE, PetscInt *); 119 PETSC_EXTERN PetscErrorCode PetscFEGetSpatialDimension(PetscFE, PetscInt *); 120 PETSC_EXTERN PetscErrorCode PetscFESetNumComponents(PetscFE, PetscInt); 121 PETSC_EXTERN PetscErrorCode PetscFEGetNumComponents(PetscFE, PetscInt *); 122 PETSC_EXTERN PetscErrorCode PetscFEGetTileSizes(PetscFE, PetscInt *, PetscInt *, PetscInt *, PetscInt *); 123 PETSC_EXTERN PetscErrorCode PetscFESetTileSizes(PetscFE, PetscInt, PetscInt, PetscInt, PetscInt); 124 PETSC_EXTERN PetscErrorCode PetscFESetBasisSpace(PetscFE, PetscSpace); 125 PETSC_EXTERN PetscErrorCode PetscFEGetBasisSpace(PetscFE, PetscSpace *); 126 PETSC_EXTERN PetscErrorCode PetscFESetDualSpace(PetscFE, PetscDualSpace); 127 PETSC_EXTERN PetscErrorCode PetscFEGetDualSpace(PetscFE, PetscDualSpace *); 128 PETSC_EXTERN PetscErrorCode PetscFESetQuadrature(PetscFE, PetscQuadrature); 129 PETSC_EXTERN PetscErrorCode PetscFEGetQuadrature(PetscFE, PetscQuadrature *); 130 PETSC_EXTERN PetscErrorCode PetscFEGetNumDof(PetscFE, const PetscInt **); 131 PETSC_EXTERN PetscErrorCode PetscFEGetDefaultTabulation(PetscFE, PetscReal **, PetscReal **, PetscReal **); 132 PETSC_EXTERN PetscErrorCode PetscFEGetTabulation(PetscFE, PetscInt, const PetscReal[], PetscReal **, PetscReal **, PetscReal **); 133 PETSC_EXTERN PetscErrorCode PetscFERestoreTabulation(PetscFE, PetscInt, const PetscReal[], PetscReal **, PetscReal **, PetscReal **); 134 135 PETSC_EXTERN PetscErrorCode PetscFEIntegrateResidual(PetscFE, PetscInt, PetscInt, PetscFE[], PetscInt, PetscCellGeometry, const PetscScalar[], 136 PetscInt, PetscFE[], const PetscScalar[], 137 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 138 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 139 PetscScalar[]); 140 PETSC_EXTERN PetscErrorCode PetscFEIntegrateBdResidual(PetscFE, PetscInt, PetscInt, PetscFE[], PetscInt, PetscCellGeometry, const PetscScalar[], 141 PetscInt, PetscFE[], const PetscScalar[], 142 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], const PetscReal[], PetscScalar[]), 143 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], const PetscReal[], PetscScalar[]), 144 PetscScalar[]); 145 PETSC_EXTERN PetscErrorCode PetscFEIntegrateJacobianAction(PetscFE, PetscInt, PetscInt, PetscFE[], PetscInt, PetscCellGeometry, const PetscScalar[], const PetscScalar[], 146 void (**)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 147 void (**)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 148 void (**)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 149 void (**)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 150 PetscScalar[]); 151 PETSC_EXTERN PetscErrorCode PetscFEIntegrateJacobian(PetscFE, PetscInt, PetscInt, PetscFE[], PetscInt, PetscInt, PetscCellGeometry, const PetscScalar[], 152 PetscInt, PetscFE[], const PetscScalar[], 153 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 154 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 155 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 156 void (*)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]), 157 PetscScalar[]); 158 159 PETSC_EXTERN PetscErrorCode PetscFEOpenCLSetRealType(PetscFE, PetscDataType); 160 PETSC_EXTERN PetscErrorCode PetscFEOpenCLGetRealType(PetscFE, PetscDataType *); 161 162 /* TODO: Should be moved inside DM */ 163 typedef struct { 164 PetscFE *fe; 165 PetscFE *feAux; 166 void (**f0Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The f_0 functions for each field */ 167 void (**f1Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The f_1 functions for each field */ 168 void (**g0Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The g_0 functions for each field pair */ 169 void (**g1Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The g_1 functions for each field pair */ 170 void (**g2Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The g_2 functions for each field pair */ 171 void (**g3Funcs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], PetscScalar[]); /* The g_3 functions for each field pair */ 172 void (**bcFuncs)(const PetscReal[], PetscScalar *, void *); /* The boundary condition function for each field component */ 173 void **bcCtxs; /* Contexts for each boundary condition function, or null if all contexts are null */ 174 PetscFE *feBd; 175 void (**f0BdFuncs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], const PetscReal[], PetscScalar[]); /* The f_0 functions for each field */ 176 void (**f1BdFuncs)(const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscReal[], const PetscReal[], PetscScalar[]); /* The f_1 functions for each field */ 177 } PetscFEM; 178 179 #endif 180