1660d4ad9SBarry Smith /* 2660d4ad9SBarry Smith Objects which encapsulate finite element spaces 3660d4ad9SBarry Smith */ 4a4963045SJacob Faibussowitsch #pragma once 5660d4ad9SBarry Smith #include <petscdm.h> 6660d4ad9SBarry Smith #include <petscdt.h> 7660d4ad9SBarry Smith #include <petscfetypes.h> 8660d4ad9SBarry Smith #include <petscdstypes.h> 9660d4ad9SBarry Smith #include <petscspace.h> 10660d4ad9SBarry Smith 11660d4ad9SBarry Smith /* SUBMANSEC = DUALSPACE */ 12660d4ad9SBarry Smith 13660d4ad9SBarry Smith /*S 14660d4ad9SBarry Smith PetscDualSpace - PETSc object that manages the dual space to a linear space, e.g. the space of evaluation functionals at the vertices of a triangle 15660d4ad9SBarry Smith 16660d4ad9SBarry Smith Level: beginner 17660d4ad9SBarry Smith 18b24fb147SBarry Smith .seealso: `PetscDualSpaceCreate()`, `PetscSpace`, `PetscSpaceCreate()`, `PetscDualSpaceSetType()`, `PetscDualSpaceType` 19660d4ad9SBarry Smith S*/ 20660d4ad9SBarry Smith typedef struct _p_PetscDualSpace *PetscDualSpace; 21660d4ad9SBarry Smith 22660d4ad9SBarry Smith /*MC 23660d4ad9SBarry Smith PetscDualSpaceReferenceCell - The type of reference cell 24660d4ad9SBarry Smith 25660d4ad9SBarry Smith Level: beginner 26660d4ad9SBarry Smith 27660d4ad9SBarry Smith Note: 28660d4ad9SBarry Smith This is used only for automatic creation of reference cells. A `PetscDualSpace` can accept an arbitrary `DM` for a reference cell. 29660d4ad9SBarry Smith 30b24fb147SBarry Smith .seealso: `PetscSpace`, `PetscDualSpaceCreate()`, `PetscDualSpaceType` 31660d4ad9SBarry Smith M*/ 32660d4ad9SBarry Smith typedef enum { 33660d4ad9SBarry Smith PETSCDUALSPACE_REFCELL_SIMPLEX, 34660d4ad9SBarry Smith PETSCDUALSPACE_REFCELL_TENSOR 35660d4ad9SBarry Smith } PetscDualSpaceReferenceCell; 36660d4ad9SBarry Smith PETSC_EXTERN const char *const PetscDualSpaceReferenceCells[]; 37660d4ad9SBarry Smith 38660d4ad9SBarry Smith /*MC 39660d4ad9SBarry Smith PetscDualSpaceTransformType - The type of function transform 40660d4ad9SBarry Smith 41b24fb147SBarry Smith Level: intermediate 42b24fb147SBarry Smith 43b24fb147SBarry Smith Values: 44b24fb147SBarry Smith + `IDENTITY_TRANSFORM` - make no changes in the function 45b24fb147SBarry Smith . `COVARIANT_PIOLA_TRANSFORM` - Covariant Piola: $\sigma^*(F) = J^{-T} F \circ \phi^{-1)$ 46b24fb147SBarry Smith - `CONTRAVARIANT_PIOLA_TRANSFORM` - Contravariant Piola: $\sigma^*(F) = 1/|J| J F \circ \phi^{-1)$ 47660d4ad9SBarry Smith 48660d4ad9SBarry Smith Notes: 49660d4ad9SBarry Smith These transforms, and their inverses, are used to move functions and functionals between the reference element and real space. 50660d4ad9SBarry Smith Suppose that we have a mapping $\phi$ which maps the reference cell to real space, and its Jacobian $J$. If we want to transform function $F$ on the reference element, 51660d4ad9SBarry Smith so that it acts on real space, we use the pushforward transform $\sigma^*$. The pullback $\sigma_*$ is the inverse transform. 52660d4ad9SBarry Smith 53660d4ad9SBarry Smith References: 54660d4ad9SBarry Smith . Rognes, Kirby, and Logg, Efficient Assembly of Hdiv and Hrot Conforming Finite Elements, SISC, 31(6), 4130-4151, arXiv 1205.3085, 2010 55660d4ad9SBarry Smith 56660d4ad9SBarry Smith .seealso: `PetscDualSpaceGetDeRahm()` 57660d4ad9SBarry Smith M*/ 58660d4ad9SBarry Smith typedef enum { 59660d4ad9SBarry Smith IDENTITY_TRANSFORM, 60660d4ad9SBarry Smith COVARIANT_PIOLA_TRANSFORM, 61660d4ad9SBarry Smith CONTRAVARIANT_PIOLA_TRANSFORM 62660d4ad9SBarry Smith } PetscDualSpaceTransformType; 63660d4ad9SBarry Smith 64660d4ad9SBarry Smith PETSC_EXTERN PetscClassId PETSCDUALSPACE_CLASSID; 65660d4ad9SBarry Smith 66660d4ad9SBarry Smith /*J 67660d4ad9SBarry Smith PetscDualSpaceType - String with the name of a PETSc dual space 68660d4ad9SBarry Smith 69b24fb147SBarry Smith Values: 70b24fb147SBarry Smith + PETSCDUALSPACELAGRANGE - a dual space of pointwise evaluation functionals 71b24fb147SBarry Smith . PETSCDUALSPACESIMPLE - a dual space defined by functionals provided with `PetscDualSpaceSimpleSetFunctional()` 72b24fb147SBarry Smith . PETSCDUALSPACEREFINED - the joint dual space defined by a group of cells, usually refined from one larger cell 73*2dce792eSToby Isaac . PETSCDUALSPACEBDM - a dual space for Brezzi-Douglas-Marini elements 74*2dce792eSToby Isaac - PETSCDUALSPACESUM - a dual space that is a sum of other dual spaces 75b24fb147SBarry Smith 76660d4ad9SBarry Smith Level: beginner 77660d4ad9SBarry Smith 78b24fb147SBarry Smith .seealso: `PetscDualSpaceSetType()`, `PetscDualSpace`, `PetscSpace` 79660d4ad9SBarry Smith J*/ 80660d4ad9SBarry Smith typedef const char *PetscDualSpaceType; 81660d4ad9SBarry Smith #define PETSCDUALSPACELAGRANGE "lagrange" 82660d4ad9SBarry Smith #define PETSCDUALSPACESIMPLE "simple" 83660d4ad9SBarry Smith #define PETSCDUALSPACEREFINED "refined" 84660d4ad9SBarry Smith #define PETSCDUALSPACEBDM "bdm" 85*2dce792eSToby Isaac #define PETSCDUALSPACESUM "sum" 86660d4ad9SBarry Smith 87660d4ad9SBarry Smith /*MC 88660d4ad9SBarry Smith PETSCDUALSPACEBDM = "bdm" - A `PetscDualSpace` object that encapsulates a dual space for Brezzi-Douglas-Marini elements 89660d4ad9SBarry Smith 90660d4ad9SBarry Smith Level: intermediate 91660d4ad9SBarry Smith 92660d4ad9SBarry Smith Note: 93660d4ad9SBarry Smith This type is a constructor alias of `PETSCDUALSPACELAGRANGE`. During 94660d4ad9SBarry Smith `PetscDualSpaceSetUp()`, the correct value of `PetscDualSpaceSetFormDegree()` is 95660d4ad9SBarry Smith set for H-div conforming spaces. The type of the dual space is then changed to 96660d4ad9SBarry Smith to `PETSCDUALSPACELAGRANGE`. 97660d4ad9SBarry Smith 98660d4ad9SBarry Smith .seealso: `PetscDualSpaceType`, `PetscDualSpaceCreate()`, `PetscDualSpaceSetType()`, `PETSCDUALSPACELAGRANGE`, `PetscDualSpaceSetFormDegree()` 99660d4ad9SBarry Smith M*/ 100660d4ad9SBarry Smith 101660d4ad9SBarry Smith PETSC_EXTERN PetscFunctionList PetscDualSpaceList; 102660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceCreate(MPI_Comm, PetscDualSpace *); 103660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceDestroy(PetscDualSpace *); 104660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceDuplicate(PetscDualSpace, PetscDualSpace *); 105660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetType(PetscDualSpace, PetscDualSpaceType); 106660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetType(PetscDualSpace, PetscDualSpaceType *); 107660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetUniform(PetscDualSpace, PetscBool *); 108660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetNumDof(PetscDualSpace, const PetscInt **); 109660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetSection(PetscDualSpace, PetscSection *); 110*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceGetInteriorSection(PetscDualSpace, PetscSection *); 111660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetUp(PetscDualSpace); 112660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetFromOptions(PetscDualSpace); 113660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceViewFromOptions(PetscDualSpace, PetscObject, const char[]); 114660d4ad9SBarry Smith 115660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceView(PetscDualSpace, PetscViewer); 116660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRegister(const char[], PetscErrorCode (*)(PetscDualSpace)); 117660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRegisterDestroy(void); 118660d4ad9SBarry Smith 119660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDimension(PetscDualSpace, PetscInt *); 120660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetInteriorDimension(PetscDualSpace, PetscInt *); 121660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetNumComponents(PetscDualSpace, PetscInt); 122660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetNumComponents(PetscDualSpace, PetscInt *); 123660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetOrder(PetscDualSpace, PetscInt); 124660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetOrder(PetscDualSpace, PetscInt *); 125660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetDM(PetscDualSpace, DM); 126660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDM(PetscDualSpace, DM *); 127660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetFunctional(PetscDualSpace, PetscInt, PetscQuadrature *); 128660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetSymmetries(PetscDualSpace, const PetscInt ****, const PetscScalar ****); 129660d4ad9SBarry Smith 130660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetAllData(PetscDualSpace, PetscQuadrature *, Mat *); 131660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateAllDataDefault(PetscDualSpace, PetscQuadrature *, Mat *); 132660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetInteriorData(PetscDualSpace, PetscQuadrature *, Mat *); 133660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateInteriorDataDefault(PetscDualSpace, PetscQuadrature *, Mat *); 134660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceEqual(PetscDualSpace, PetscDualSpace, PetscBool *); 135660d4ad9SBarry Smith 136660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyAll(PetscDualSpace, const PetscScalar *, PetscScalar *); 137660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyAllDefault(PetscDualSpace, const PetscScalar *, PetscScalar *); 138660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyInterior(PetscDualSpace, const PetscScalar *, PetscScalar *); 139660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyInteriorDefault(PetscDualSpace, const PetscScalar *, PetscScalar *); 140660d4ad9SBarry Smith 141660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetFormDegree(PetscDualSpace, PetscInt *); 142660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetFormDegree(PetscDualSpace, PetscInt); 143660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDeRahm(PetscDualSpace, PetscInt *); 144660d4ad9SBarry Smith 145660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetContinuity(PetscDualSpace, PetscBool *); 146660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetContinuity(PetscDualSpace, PetscBool); 147660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetTensor(PetscDualSpace, PetscBool *); 148660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetTensor(PetscDualSpace, PetscBool); 149660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetTrimmed(PetscDualSpace, PetscBool *); 150660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetTrimmed(PetscDualSpace, PetscBool); 151660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetNodeType(PetscDualSpace, PetscDTNodeType *, PetscBool *, PetscReal *); 152660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetNodeType(PetscDualSpace, PetscDTNodeType, PetscBool, PetscReal); 153660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetUseMoments(PetscDualSpace, PetscBool *); 154660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetUseMoments(PetscDualSpace, PetscBool); 155660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetMomentOrder(PetscDualSpace, PetscInt *); 156660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetMomentOrder(PetscDualSpace, PetscInt); 157660d4ad9SBarry Smith 158660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetHeightSubspace(PetscDualSpace, PetscInt, PetscDualSpace *); 159660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetPointSubspace(PetscDualSpace, PetscInt, PetscDualSpace *); 160660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSimpleSetDimension(PetscDualSpace, PetscInt); 161660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSimpleSetFunctional(PetscDualSpace, PetscInt, PetscQuadrature); 162660d4ad9SBarry Smith 163660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRefinedSetCellSpaces(PetscDualSpace, const PetscDualSpace[]); 164660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscSpaceCreateSubspace(PetscSpace, PetscDualSpace, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscCopyMode, PetscSpace *); 165*2dce792eSToby Isaac 166*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetNumSubspaces(PetscDualSpace, PetscInt); 167*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetNumSubspaces(PetscDualSpace, PetscInt *); 168*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetSubspace(PetscDualSpace, PetscInt, PetscDualSpace); 169*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetSubspace(PetscDualSpace, PetscInt, PetscDualSpace *); 170*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetConcatenate(PetscDualSpace, PetscBool); 171*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetConcatenate(PetscDualSpace, PetscBool *); 172*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetInterleave(PetscDualSpace, PetscBool, PetscBool); 173*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetInterleave(PetscDualSpace, PetscBool *, PetscBool *); 174*2dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateSum(PetscInt, const PetscDualSpace[], PetscBool, PetscDualSpace *); 175