xref: /petsc/include/petscdualspace.h (revision 6d8694c4fbab79f9439f1ad13c0386ba7ee1ca4b)
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 
11*ce78bad3SBarry Smith /* MANSEC = DM */
12660d4ad9SBarry Smith /* SUBMANSEC = DUALSPACE */
13660d4ad9SBarry Smith 
14660d4ad9SBarry Smith /*S
15660d4ad9SBarry 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
16660d4ad9SBarry Smith 
17660d4ad9SBarry Smith   Level: beginner
18660d4ad9SBarry Smith 
19b24fb147SBarry Smith .seealso: `PetscDualSpaceCreate()`, `PetscSpace`, `PetscSpaceCreate()`, `PetscDualSpaceSetType()`, `PetscDualSpaceType`
20660d4ad9SBarry Smith S*/
21660d4ad9SBarry Smith typedef struct _p_PetscDualSpace *PetscDualSpace;
22660d4ad9SBarry Smith 
23660d4ad9SBarry Smith /*MC
24660d4ad9SBarry Smith   PetscDualSpaceReferenceCell - The type of reference cell
25660d4ad9SBarry Smith 
26660d4ad9SBarry Smith   Level: beginner
27660d4ad9SBarry Smith 
28660d4ad9SBarry Smith   Note:
29660d4ad9SBarry Smith   This is used only for automatic creation of reference cells. A `PetscDualSpace` can accept an arbitrary `DM` for a reference cell.
30660d4ad9SBarry Smith 
31b24fb147SBarry Smith .seealso: `PetscSpace`, `PetscDualSpaceCreate()`, `PetscDualSpaceType`
32660d4ad9SBarry Smith M*/
33660d4ad9SBarry Smith typedef enum {
34660d4ad9SBarry Smith   PETSCDUALSPACE_REFCELL_SIMPLEX,
35660d4ad9SBarry Smith   PETSCDUALSPACE_REFCELL_TENSOR
36660d4ad9SBarry Smith } PetscDualSpaceReferenceCell;
37660d4ad9SBarry Smith PETSC_EXTERN const char *const PetscDualSpaceReferenceCells[];
38660d4ad9SBarry Smith 
39660d4ad9SBarry Smith /*MC
40660d4ad9SBarry Smith   PetscDualSpaceTransformType - The type of function transform
41660d4ad9SBarry Smith 
42b24fb147SBarry Smith   Values:
43b24fb147SBarry Smith +  `IDENTITY_TRANSFORM`            - make no changes in the function
44b24fb147SBarry Smith .  `COVARIANT_PIOLA_TRANSFORM`     - Covariant Piola: $\sigma^*(F) = J^{-T} F \circ \phi^{-1)$
45b24fb147SBarry Smith -  `CONTRAVARIANT_PIOLA_TRANSFORM` - Contravariant Piola: $\sigma^*(F) = 1/|J| J F \circ \phi^{-1)$
46660d4ad9SBarry Smith 
4795bd0b28SBarry Smith   Level: intermediate
4895bd0b28SBarry Smith 
4995bd0b28SBarry Smith   Note:
50660d4ad9SBarry Smith   These transforms, and their inverses, are used to move functions and functionals between the reference element and real space.
51660d4ad9SBarry 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,
52660d4ad9SBarry Smith   so that it acts on real space, we use the pushforward transform $\sigma^*$. The pullback $\sigma_*$ is the inverse transform.
531d27aa22SBarry Smith   {cite}`rogneskirbylogg2009`
54660d4ad9SBarry Smith 
55660d4ad9SBarry Smith .seealso: `PetscDualSpaceGetDeRahm()`
56660d4ad9SBarry Smith M*/
57660d4ad9SBarry Smith typedef enum {
58660d4ad9SBarry Smith   IDENTITY_TRANSFORM,
59660d4ad9SBarry Smith   COVARIANT_PIOLA_TRANSFORM,
60660d4ad9SBarry Smith   CONTRAVARIANT_PIOLA_TRANSFORM
61660d4ad9SBarry Smith } PetscDualSpaceTransformType;
62660d4ad9SBarry Smith 
63660d4ad9SBarry Smith PETSC_EXTERN PetscClassId PETSCDUALSPACE_CLASSID;
64660d4ad9SBarry Smith 
65660d4ad9SBarry Smith /*J
66660d4ad9SBarry Smith   PetscDualSpaceType - String with the name of a PETSc dual space
67660d4ad9SBarry Smith 
68b24fb147SBarry Smith   Values:
69b24fb147SBarry Smith + PETSCDUALSPACELAGRANGE  - a dual space of pointwise evaluation functionals
70b24fb147SBarry Smith . PETSCDUALSPACESIMPLE    - a dual space defined by functionals provided with `PetscDualSpaceSimpleSetFunctional()`
71b24fb147SBarry Smith . PETSCDUALSPACEREFINED   - the joint dual space defined by a group of cells, usually refined from one larger cell
722dce792eSToby Isaac . PETSCDUALSPACEBDM       - a dual space for Brezzi-Douglas-Marini elements
732dce792eSToby Isaac - PETSCDUALSPACESUM       - a dual space that is a sum of other dual spaces
74b24fb147SBarry Smith 
75660d4ad9SBarry Smith   Level: beginner
76660d4ad9SBarry Smith 
77b24fb147SBarry Smith .seealso: `PetscDualSpaceSetType()`, `PetscDualSpace`, `PetscSpace`
78660d4ad9SBarry Smith J*/
79660d4ad9SBarry Smith typedef const char *PetscDualSpaceType;
80660d4ad9SBarry Smith #define PETSCDUALSPACELAGRANGE "lagrange"
81660d4ad9SBarry Smith #define PETSCDUALSPACESIMPLE   "simple"
82660d4ad9SBarry Smith #define PETSCDUALSPACEREFINED  "refined"
83660d4ad9SBarry Smith #define PETSCDUALSPACEBDM      "bdm"
842dce792eSToby Isaac #define PETSCDUALSPACESUM      "sum"
85660d4ad9SBarry Smith 
86660d4ad9SBarry Smith /*MC
87660d4ad9SBarry Smith   PETSCDUALSPACEBDM = "bdm" - A `PetscDualSpace` object that encapsulates a dual space for Brezzi-Douglas-Marini elements
88660d4ad9SBarry Smith 
89660d4ad9SBarry Smith   Level: intermediate
90660d4ad9SBarry Smith 
91660d4ad9SBarry Smith   Note:
92660d4ad9SBarry Smith   This type is a constructor alias of `PETSCDUALSPACELAGRANGE`.  During
93660d4ad9SBarry Smith   `PetscDualSpaceSetUp()`, the correct value of `PetscDualSpaceSetFormDegree()` is
94660d4ad9SBarry Smith   set for H-div conforming spaces. The type of the dual space is then changed to
95660d4ad9SBarry Smith   to `PETSCDUALSPACELAGRANGE`.
96660d4ad9SBarry Smith 
97660d4ad9SBarry Smith .seealso: `PetscDualSpaceType`, `PetscDualSpaceCreate()`, `PetscDualSpaceSetType()`, `PETSCDUALSPACELAGRANGE`, `PetscDualSpaceSetFormDegree()`
98660d4ad9SBarry Smith M*/
99660d4ad9SBarry Smith 
100660d4ad9SBarry Smith PETSC_EXTERN PetscFunctionList PetscDualSpaceList;
101660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceCreate(MPI_Comm, PetscDualSpace *);
102660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceDestroy(PetscDualSpace *);
103660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceDuplicate(PetscDualSpace, PetscDualSpace *);
104660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceSetType(PetscDualSpace, PetscDualSpaceType);
105660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceGetType(PetscDualSpace, PetscDualSpaceType *);
106660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceGetUniform(PetscDualSpace, PetscBool *);
107660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceGetNumDof(PetscDualSpace, const PetscInt **);
108660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceGetSection(PetscDualSpace, PetscSection *);
1092dce792eSToby Isaac PETSC_EXTERN PetscErrorCode    PetscDualSpaceGetInteriorSection(PetscDualSpace, PetscSection *);
110660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceSetUp(PetscDualSpace);
111660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceSetFromOptions(PetscDualSpace);
112660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode    PetscDualSpaceViewFromOptions(PetscDualSpace, PetscObject, const char[]);
113660d4ad9SBarry Smith 
114660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceView(PetscDualSpace, PetscViewer);
115660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRegister(const char[], PetscErrorCode (*)(PetscDualSpace));
116660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRegisterDestroy(void);
117660d4ad9SBarry Smith 
118660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDimension(PetscDualSpace, PetscInt *);
119660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetInteriorDimension(PetscDualSpace, PetscInt *);
120660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetNumComponents(PetscDualSpace, PetscInt);
121660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetNumComponents(PetscDualSpace, PetscInt *);
122660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetOrder(PetscDualSpace, PetscInt);
123660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetOrder(PetscDualSpace, PetscInt *);
124660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetDM(PetscDualSpace, DM);
125660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDM(PetscDualSpace, DM *);
126660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetFunctional(PetscDualSpace, PetscInt, PetscQuadrature *);
127660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetSymmetries(PetscDualSpace, const PetscInt ****, const PetscScalar ****);
128660d4ad9SBarry Smith 
129660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetAllData(PetscDualSpace, PetscQuadrature *, Mat *);
130660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateAllDataDefault(PetscDualSpace, PetscQuadrature *, Mat *);
131660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetInteriorData(PetscDualSpace, PetscQuadrature *, Mat *);
132660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateInteriorDataDefault(PetscDualSpace, PetscQuadrature *, Mat *);
133660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceEqual(PetscDualSpace, PetscDualSpace, PetscBool *);
134660d4ad9SBarry Smith 
135660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyAll(PetscDualSpace, const PetscScalar *, PetscScalar *);
136660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyAllDefault(PetscDualSpace, const PetscScalar *, PetscScalar *);
137660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyInterior(PetscDualSpace, const PetscScalar *, PetscScalar *);
138660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceApplyInteriorDefault(PetscDualSpace, const PetscScalar *, PetscScalar *);
139660d4ad9SBarry Smith 
140660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetFormDegree(PetscDualSpace, PetscInt *);
141660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSetFormDegree(PetscDualSpace, PetscInt);
142660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetDeRahm(PetscDualSpace, PetscInt *);
143660d4ad9SBarry Smith 
144660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetContinuity(PetscDualSpace, PetscBool *);
145660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetContinuity(PetscDualSpace, PetscBool);
146660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetTensor(PetscDualSpace, PetscBool *);
147660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetTensor(PetscDualSpace, PetscBool);
148660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetTrimmed(PetscDualSpace, PetscBool *);
149660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetTrimmed(PetscDualSpace, PetscBool);
150660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetNodeType(PetscDualSpace, PetscDTNodeType *, PetscBool *, PetscReal *);
151660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetNodeType(PetscDualSpace, PetscDTNodeType, PetscBool, PetscReal);
152660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetUseMoments(PetscDualSpace, PetscBool *);
153660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetUseMoments(PetscDualSpace, PetscBool);
154660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeGetMomentOrder(PetscDualSpace, PetscInt *);
155660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceLagrangeSetMomentOrder(PetscDualSpace, PetscInt);
156660d4ad9SBarry Smith 
157660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetHeightSubspace(PetscDualSpace, PetscInt, PetscDualSpace *);
158660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceGetPointSubspace(PetscDualSpace, PetscInt, PetscDualSpace *);
159660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSimpleSetDimension(PetscDualSpace, PetscInt);
160660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceSimpleSetFunctional(PetscDualSpace, PetscInt, PetscQuadrature);
161660d4ad9SBarry Smith 
162660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscDualSpaceRefinedSetCellSpaces(PetscDualSpace, const PetscDualSpace[]);
163660d4ad9SBarry Smith PETSC_EXTERN PetscErrorCode PetscSpaceCreateSubspace(PetscSpace, PetscDualSpace, PetscReal *, PetscReal *, PetscReal *, PetscReal *, PetscCopyMode, PetscSpace *);
1642dce792eSToby Isaac 
1652dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetNumSubspaces(PetscDualSpace, PetscInt);
1662dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetNumSubspaces(PetscDualSpace, PetscInt *);
1672dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetSubspace(PetscDualSpace, PetscInt, PetscDualSpace);
1682dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetSubspace(PetscDualSpace, PetscInt, PetscDualSpace *);
1692dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetConcatenate(PetscDualSpace, PetscBool);
1702dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetConcatenate(PetscDualSpace, PetscBool *);
1712dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumSetInterleave(PetscDualSpace, PetscBool, PetscBool);
1722dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceSumGetInterleave(PetscDualSpace, PetscBool *, PetscBool *);
1732dce792eSToby Isaac PETSC_EXTERN PetscErrorCode PetscDualSpaceCreateSum(PetscInt, const PetscDualSpace[], PetscBool, PetscDualSpace *);
174