xref: /petsc/include/petscdmtypes.h (revision 1d27aa22b2f6148b2c4e3f06a75e0638d6493e09)
1a4963045SJacob Faibussowitsch #pragma once
21e25c274SJed Brown 
3ac09b921SBarry Smith /* SUBMANSEC = DM */
4ac09b921SBarry Smith 
51e25c274SJed Brown /*S
616a05f60SBarry Smith      DM - Abstract PETSc object that manages an abstract grid-like object and its interactions with the algebraic solvers
71e25c274SJed Brown 
81e25c274SJed Brown    Level: intermediate
91e25c274SJed Brown 
101cc06b55SBarry Smith .seealso: [](ch_dmbase), `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX`
111e25c274SJed Brown S*/
121e25c274SJed Brown typedef struct _p_DM *DM;
131e25c274SJed Brown 
14bff4a2f0SMatthew G. Knepley /*E
1516a05f60SBarry Smith   DMBoundaryType - Describes the choice for the filling of ghost cells on physical domain boundaries.
1616a05f60SBarry Smith 
1716a05f60SBarry Smith   Values:
1816a05f60SBarry Smith + `DM_BOUNDARY_NONE` - no ghost nodes
1916a05f60SBarry Smith . `DM_BOUNDARY_GHOSTED` - ghost vertices/cells exist but aren't filled; you can put values into them and then apply a stencil that uses those ghost locations
2016a05f60SBarry Smith . `DM_BOUNDARY_MIRROR` - the ghost value is the same as the value 1 grid point in; that is, the 0th grid point in the real mesh acts like a mirror to define
2116a05f60SBarry Smith                          the ghost point value; not yet implemented for 3d
2216a05f60SBarry Smith . `DM_BOUNDARY_PERIODIC` - ghost vertices/cells filled by the opposite edge of the domain
2316a05f60SBarry Smith - `DM_BOUNDARY_TWIST` - like periodic, only glued backwards like a Mobius strip
24bff4a2f0SMatthew G. Knepley 
25bff4a2f0SMatthew G. Knepley   Level: beginner
26bff4a2f0SMatthew G. Knepley 
27dbb368e6SPatrick Sanan   Notes:
28dbb368e6SPatrick Sanan   This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between
2987497f52SBarry Smith   processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`.
30bff4a2f0SMatthew G. Knepley 
3187497f52SBarry Smith   If the physical grid points have values 0 1 2 3 with `DM_BOUNDARY_MIRROR` then the local vector with ghost points has the values 1 0 1 2 3 2.
32288e7d53SBarry Smith 
33*1d27aa22SBarry Smith   See <https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond>
34*1d27aa22SBarry Smith 
3595bd0b28SBarry Smith   Developer Note:
3687497f52SBarry Smith     Should `DM_BOUNDARY_MIRROR` have the same meaning with DMDA_Q0, that is a staggered grid? In that case should the ghost point have the same value
37288e7d53SBarry Smith   as the 0th grid point where the physical boundary serves as the mirror?
38288e7d53SBarry Smith 
3916a05f60SBarry Smith .seealso: `DM`, `DMDA`, `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()`
40bff4a2f0SMatthew G. Knepley E*/
419371c9d4SSatish Balay typedef enum {
429371c9d4SSatish Balay   DM_BOUNDARY_NONE,
439371c9d4SSatish Balay   DM_BOUNDARY_GHOSTED,
449371c9d4SSatish Balay   DM_BOUNDARY_MIRROR,
459371c9d4SSatish Balay   DM_BOUNDARY_PERIODIC,
469371c9d4SSatish Balay   DM_BOUNDARY_TWIST
479371c9d4SSatish Balay } DMBoundaryType;
4816a05f60SBarry Smith 
4962a38674SMatthew G. Knepley /*E
509dc85fa5SMatthew G. Knepley   DMBoundaryConditionType - indicates what type of boundary condition is to be imposed
519dc85fa5SMatthew G. Knepley 
5216a05f60SBarry Smith   Values:
5316a05f60SBarry Smith + `DM_BC_ESSENTIAL`       - A Dirichlet condition using a function of the coordinates
5416a05f60SBarry Smith . `DM_BC_ESSENTIAL_FIELD` - A Dirichlet condition using a function of the coordinates and auxiliary field data
5516a05f60SBarry Smith . `DM_BC_ESSENTIAL_BD_FIELD` - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data
5616a05f60SBarry Smith . `DM_BC_NATURAL`         - A Neumann condition using a function of the coordinates
5716a05f60SBarry Smith . `DM_BC_NATURAL_FIELD`   - A Neumann condition using a function of the coordinates and auxiliary field data
5816a05f60SBarry Smith - `DM_BC_NATURAL_RIEMANN` - A flux condition which determines the state in ghost cells
599dc85fa5SMatthew G. Knepley 
609dc85fa5SMatthew G. Knepley   Level: beginner
619dc85fa5SMatthew G. Knepley 
6216a05f60SBarry Smith   Note:
6316a05f60SBarry Smith   The user can check whether a boundary condition is essential using (type & `DM_BC_ESSENTIAL`), and similarly for
6416a05f60SBarry Smith   natural conditions (type & `DM_BC_NATURAL`)
6516a05f60SBarry Smith 
6616a05f60SBarry Smith .seealso: `DM`, `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
679dc85fa5SMatthew G. Knepley E*/
689371c9d4SSatish Balay typedef enum {
699371c9d4SSatish Balay   DM_BC_ESSENTIAL          = 1,
709371c9d4SSatish Balay   DM_BC_ESSENTIAL_FIELD    = 5,
719371c9d4SSatish Balay   DM_BC_NATURAL            = 2,
729371c9d4SSatish Balay   DM_BC_NATURAL_FIELD      = 6,
739371c9d4SSatish Balay   DM_BC_ESSENTIAL_BD_FIELD = 9,
749371c9d4SSatish Balay   DM_BC_NATURAL_RIEMANN    = 10
759371c9d4SSatish Balay } DMBoundaryConditionType;
769dc85fa5SMatthew G. Knepley 
779dc85fa5SMatthew G. Knepley /*E
7862a38674SMatthew G. Knepley   DMPointLocationType - Describes the method to handle point location failure
7962a38674SMatthew G. Knepley 
8016a05f60SBarry Smith   Values:
8116a05f60SBarry Smith +  `DM_POINTLOCATION_NONE` - return a negative cell number
8216a05f60SBarry Smith .  `DM_POINTLOCATION_NEAREST` - the (approximate) nearest point in the mesh is used
8316a05f60SBarry Smith -  `DM_POINTLOCATION_REMOVE` - returns values only for points which were located
8462a38674SMatthew G. Knepley 
8516a05f60SBarry Smith   Level: intermediate
8662a38674SMatthew G. Knepley 
8716a05f60SBarry Smith .seealso: `DM`, `DMLocatePoints()`
8862a38674SMatthew G. Knepley E*/
899371c9d4SSatish Balay typedef enum {
909371c9d4SSatish Balay   DM_POINTLOCATION_NONE,
919371c9d4SSatish Balay   DM_POINTLOCATION_NEAREST,
929371c9d4SSatish Balay   DM_POINTLOCATION_REMOVE
939371c9d4SSatish Balay } DMPointLocationType;
9462a38674SMatthew G. Knepley 
955675c177SMatthew G. Knepley /*E
96863027abSJed Brown   DMBlockingType - Describes how to choose variable block sizes
97863027abSJed Brown 
9816a05f60SBarry Smith   Values:
9916a05f60SBarry Smith +  `DM_BLOCKING_TOPOLOGICAL_POINT` - select all fields at a topological point (cell center, at a face, etc)
10016a05f60SBarry Smith -  `DM_BLOCKING_FIELD_NODE` - using a separate block for each field at a topological point
10116a05f60SBarry Smith 
102863027abSJed Brown   Level: intermediate
103863027abSJed Brown 
10416a05f60SBarry Smith   Note:
105863027abSJed Brown   When using `PCVPBJACOBI`, one can choose to block by topological point (all fields at a cell center, at a face, etc.)
106863027abSJed Brown   or by field nodes (using number of components per field to identify "nodes"). Field nodes lead to smaller blocks, but
107863027abSJed Brown   may converge more slowly. For example, a cubic Lagrange hexahedron will have one node at vertices, two at edges, four
108863027abSJed Brown   at faces, and eight at cell centers. If using point blocking, the `PCVPBJACOBI` preconditioner will work with block
109863027abSJed Brown   sizes up to 8 Lagrange nodes. For 5-component CFD, this produces matrices up to 40x40, which increases memory
11016a05f60SBarry Smith   footprint and may harm performance. With field node blocking, the maximum block size will correspond to one Lagrange node,
111863027abSJed Brown   or 5x5 blocks for the CFD example.
112863027abSJed Brown 
113863027abSJed Brown .seealso: `PCVPBJACOBI`, `MatSetVariableBlockSizes()`, `DMSetBlockingType()`
114863027abSJed Brown E*/
115863027abSJed Brown typedef enum {
1160e762ea3SJed Brown   DM_BLOCKING_TOPOLOGICAL_POINT,
117863027abSJed Brown   DM_BLOCKING_FIELD_NODE
118863027abSJed Brown } DMBlockingType;
119863027abSJed Brown 
120863027abSJed Brown /*E
121174e7490SMatthew G. Knepley   DMAdaptationStrategy - Describes the strategy used for adaptive solves
1225675c177SMatthew G. Knepley 
12316a05f60SBarry Smith   Values:
12416a05f60SBarry Smith +  `DM_ADAPTATION_INITIAL` - refine a mesh based on an initial guess
12516a05f60SBarry Smith .  `DM_ADAPTATION_SEQUENTIAL` - refine the mesh based on a sequence of solves, much like grid sequencing
12616a05f60SBarry Smith -  `DM_ADAPTATION_MULTILEVEL` - use the sequence of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt
12716a05f60SBarry Smith 
1285675c177SMatthew G. Knepley   Level: beginner
1295675c177SMatthew G. Knepley 
13016a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationCriterion`, `DMAdaptorSolve()`
1315675c177SMatthew G. Knepley E*/
1329371c9d4SSatish Balay typedef enum {
1339371c9d4SSatish Balay   DM_ADAPTATION_INITIAL,
1349371c9d4SSatish Balay   DM_ADAPTATION_SEQUENTIAL,
1359371c9d4SSatish Balay   DM_ADAPTATION_MULTILEVEL
1369371c9d4SSatish Balay } DMAdaptationStrategy;
137174e7490SMatthew G. Knepley 
138174e7490SMatthew G. Knepley /*E
139174e7490SMatthew G. Knepley   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh
140174e7490SMatthew G. Knepley 
14116a05f60SBarry Smith   Values:
14216a05f60SBarry Smith + `DM_ADAPTATION_REFINE` - uniformly refine a mesh, much like grid sequencing
14316a05f60SBarry Smith . `DM_ADAPTATION_LABEL` - adapt the mesh based upon a label of the cells filled with `DMAdaptFlag` markers.
14416a05f60SBarry Smith . `DM_ADAPTATION_METRIC` - try to mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
14516a05f60SBarry Smith                            upon an input primal or a gradient field.
14616a05f60SBarry Smith - `DM_ADAPTATION_NONE` - do no adaptation
14716a05f60SBarry Smith 
148174e7490SMatthew G. Knepley   Level: beginner
149174e7490SMatthew G. Knepley 
15016a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptorSolve()`
151174e7490SMatthew G. Knepley E*/
1529371c9d4SSatish Balay typedef enum {
1539371c9d4SSatish Balay   DM_ADAPTATION_NONE,
1549371c9d4SSatish Balay   DM_ADAPTATION_REFINE,
1559371c9d4SSatish Balay   DM_ADAPTATION_LABEL,
1569371c9d4SSatish Balay   DM_ADAPTATION_METRIC
1579371c9d4SSatish Balay } DMAdaptationCriterion;
1585675c177SMatthew G. Knepley 
1599dc85fa5SMatthew G. Knepley /*E
16016a05f60SBarry Smith   DMAdaptFlag - Marker in the label prescribing what adaptation to perform
16116a05f60SBarry Smith 
16216a05f60SBarry Smith   Values:
16316a05f60SBarry Smith +  `DM_ADAPT_DETERMINE` - undocumented
16416a05f60SBarry Smith .  `DM_ADAPT_KEEP` - undocumented
16516a05f60SBarry Smith .  `DM_ADAPT_REFINE` - undocumented
16616a05f60SBarry Smith .  `DM_ADAPT_COARSEN` - undocumented
16716a05f60SBarry Smith -  `DM_ADAPT_COARSEN_LAST` - undocumented
1689dc85fa5SMatthew G. Knepley 
1699dc85fa5SMatthew G. Knepley   Level: beginner
1709dc85fa5SMatthew G. Knepley 
17116a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptationCriterion`, `DMAdaptorSolve()`, `DMAdaptLabel()`
1729dc85fa5SMatthew G. Knepley E*/
1739371c9d4SSatish Balay typedef enum {
1749371c9d4SSatish Balay   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
1759371c9d4SSatish Balay   DM_ADAPT_KEEP      = 0,
1769371c9d4SSatish Balay   DM_ADAPT_REFINE,
1779371c9d4SSatish Balay   DM_ADAPT_COARSEN,
1789371c9d4SSatish Balay   DM_ADAPT_COARSEN_LAST,
1799371c9d4SSatish Balay   DM_ADAPT_RESERVED_COUNT
1809371c9d4SSatish Balay } DMAdaptFlag;
1813ee9839eSMatthew G. Knepley 
1823ee9839eSMatthew G. Knepley /*E
1833ee9839eSMatthew G. Knepley   DMDirection - Indicates a coordinate direction
1843ee9839eSMatthew G. Knepley 
18516a05f60SBarry Smith    Values:
18616a05f60SBarry Smith +  `DM_X` - the x coordinate direction
18716a05f60SBarry Smith .  `DM_Y` - the y coordinate direction
18816a05f60SBarry Smith -  `DM_Z` - the z coordinate direction
18916a05f60SBarry Smith 
1903ee9839eSMatthew G. Knepley   Level: beginner
1913ee9839eSMatthew G. Knepley 
19216a05f60SBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
1933ee9839eSMatthew G. Knepley E*/
1949371c9d4SSatish Balay typedef enum {
1959371c9d4SSatish Balay   DM_X,
1969371c9d4SSatish Balay   DM_Y,
1979371c9d4SSatish Balay   DM_Z
1989371c9d4SSatish Balay } DMDirection;
1999dc85fa5SMatthew G. Knepley 
200a6e0b375SMatthew G. Knepley /*E
20187497f52SBarry Smith   DMEnclosureType - The type of enclosure relation between one `DM` and another
202a6e0b375SMatthew G. Knepley 
20316a05f60SBarry Smith    Values:
20416a05f60SBarry Smith +  `DM_ENC_SUBMESH` - the `DM` is the boundary of another `DM`
20516a05f60SBarry Smith .  `DM_ENC_SUPERMESH`  - the `DM` has the boundary of another `DM` (the reverse situation to `DM_ENC_SUBMESH`)
206f826b5fcSPierre Jolivet .  `DM_ENC_EQUALITY` - unknown what this means
207f826b5fcSPierre Jolivet .  `DM_ENC_NONE` - no relationship can be determined
20816a05f60SBarry Smith -  `DM_ENC_UNKNOWN`  - the relationship is unknown
20916a05f60SBarry Smith 
210a6e0b375SMatthew G. Knepley   Level: beginner
211a6e0b375SMatthew G. Knepley 
21216a05f60SBarry Smith .seealso: `DM`, `DMGetEnclosureRelation()`
213a6e0b375SMatthew G. Knepley E*/
2149371c9d4SSatish Balay typedef enum {
2159371c9d4SSatish Balay   DM_ENC_EQUALITY,
2169371c9d4SSatish Balay   DM_ENC_SUPERMESH,
2179371c9d4SSatish Balay   DM_ENC_SUBMESH,
2189371c9d4SSatish Balay   DM_ENC_NONE,
2199371c9d4SSatish Balay   DM_ENC_UNKNOWN
2209371c9d4SSatish Balay } DMEnclosureType;
221ba2698f1SMatthew G. Knepley 
222ba2698f1SMatthew G. Knepley /*E
223ba2698f1SMatthew G. Knepley   DMPolytopeType - This describes the polytope represented by each cell.
224ba2698f1SMatthew G. Knepley 
225ba2698f1SMatthew G. Knepley   Level: beginner
226ba2698f1SMatthew G. Knepley 
22787497f52SBarry Smith   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
228ba2698f1SMatthew G. Knepley   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
22987497f52SBarry Smith   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
2309c89aa79SPierre Jolivet   constituent points. Normally these types are automatically inferred and the user does not specify
231ba2698f1SMatthew G. Knepley   them.
232ba2698f1SMatthew G. Knepley 
23316a05f60SBarry Smith .seealso: `DM`, `DMPlexComputeCellTypes()`
234ba2698f1SMatthew G. Knepley E*/
2359371c9d4SSatish Balay typedef enum {
2369371c9d4SSatish Balay   DM_POLYTOPE_POINT,
2379371c9d4SSatish Balay   DM_POLYTOPE_SEGMENT,
2389371c9d4SSatish Balay   DM_POLYTOPE_POINT_PRISM_TENSOR,
2399371c9d4SSatish Balay   DM_POLYTOPE_TRIANGLE,
2409371c9d4SSatish Balay   DM_POLYTOPE_QUADRILATERAL,
2419371c9d4SSatish Balay   DM_POLYTOPE_SEG_PRISM_TENSOR,
2429371c9d4SSatish Balay   DM_POLYTOPE_TETRAHEDRON,
2439371c9d4SSatish Balay   DM_POLYTOPE_HEXAHEDRON,
2449371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM,
2459371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM_TENSOR,
2469371c9d4SSatish Balay   DM_POLYTOPE_QUAD_PRISM_TENSOR,
2479371c9d4SSatish Balay   DM_POLYTOPE_PYRAMID,
2489371c9d4SSatish Balay   DM_POLYTOPE_FV_GHOST,
2499371c9d4SSatish Balay   DM_POLYTOPE_INTERIOR_GHOST,
2509371c9d4SSatish Balay   DM_POLYTOPE_UNKNOWN,
2519371c9d4SSatish Balay   DM_NUM_POLYTOPES
2529371c9d4SSatish Balay } DMPolytopeType;
253ba2698f1SMatthew G. Knepley PETSC_EXTERN const char *const DMPolytopeTypes[];
254a6e0b375SMatthew G. Knepley 
2559dc85fa5SMatthew G. Knepley /*E
2569dc85fa5SMatthew G. Knepley   PetscUnit - The seven fundamental SI units
2579dc85fa5SMatthew G. Knepley 
2589dc85fa5SMatthew G. Knepley   Level: beginner
2599dc85fa5SMatthew G. Knepley 
260db781477SPatrick Sanan .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
2619dc85fa5SMatthew G. Knepley E*/
2629371c9d4SSatish Balay typedef enum {
2639371c9d4SSatish Balay   PETSC_UNIT_LENGTH,
2649371c9d4SSatish Balay   PETSC_UNIT_MASS,
2659371c9d4SSatish Balay   PETSC_UNIT_TIME,
2669371c9d4SSatish Balay   PETSC_UNIT_CURRENT,
2679371c9d4SSatish Balay   PETSC_UNIT_TEMPERATURE,
2689371c9d4SSatish Balay   PETSC_UNIT_AMOUNT,
2699371c9d4SSatish Balay   PETSC_UNIT_LUMINOSITY,
2709371c9d4SSatish Balay   NUM_PETSC_UNITS
2719371c9d4SSatish Balay } PetscUnit;
2729dc85fa5SMatthew G. Knepley 
273b2b58855SToby Isaac /*S
274b2b58855SToby Isaac     DMField - PETSc object for defining a field on a mesh topology
275b2b58855SToby Isaac 
276b2b58855SToby Isaac     Level: intermediate
277b2b58855SToby Isaac S*/
278b2b58855SToby Isaac typedef struct _p_DMField *DMField;
279b2b58855SToby Isaac 
2800fdc7489SMatthew Knepley /*S
28187497f52SBarry Smith     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively
2820fdc7489SMatthew Knepley 
2830fdc7489SMatthew Knepley     Level: developer
2840fdc7489SMatthew Knepley S*/
2850fdc7489SMatthew Knepley typedef struct _p_UniversalLabel *DMUniversalLabel;
2860fdc7489SMatthew Knepley 
287d2b2dc1eSMatthew G. Knepley typedef struct _PETSc_DMCEED *DMCeed;
288d2b2dc1eSMatthew G. Knepley 
289c0517cd5SMatthew G. Knepley typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;
290