xref: /petsc/include/petscdmtypes.h (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
16524c165SJacob Faibussowitsch #ifndef PETSCDMTYPES_H
226bd1501SBarry Smith #define PETSCDMTYPES_H
31e25c274SJed Brown 
4ac09b921SBarry Smith /* SUBMANSEC = DM */
5ac09b921SBarry Smith 
61e25c274SJed Brown /*S
71e25c274SJed Brown      DM - Abstract PETSc object that manages an abstract grid object and its interactions with the algebraic solvers
81e25c274SJed Brown 
91e25c274SJed Brown    Level: intermediate
101e25c274SJed Brown 
11*dce8aebaSBarry Smith .seealso: `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX`
121e25c274SJed Brown S*/
131e25c274SJed Brown typedef struct _p_DM *DM;
141e25c274SJed Brown 
15bff4a2f0SMatthew G. Knepley /*E
16bff4a2f0SMatthew G. Knepley   DMBoundaryType - Describes the choice for fill of ghost cells on physical domain boundaries.
17bff4a2f0SMatthew G. Knepley 
18bff4a2f0SMatthew G. Knepley   Level: beginner
19bff4a2f0SMatthew G. Knepley 
2087497f52SBarry Smith   A boundary may be of type `DM_BOUNDARY_NONE` (no ghost nodes), `DM_BOUNDARY_GHOSTED` (ghost vertices/cells
21dbb368e6SPatrick Sanan   exist but aren't filled; you can put values into them and then apply a stencil that uses those ghost locations),
2287497f52SBarry 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 the ghost point value;
2387497f52SBarry Smith   not yet implemented for 3d), `DM_BOUNDARY_PERIODIC` (ghost vertices/cells filled by the opposite
2487497f52SBarry Smith   edge of the domain), or `DM_BOUNDARY_TWIST` (like periodic, only glued backwards like a Mobius strip).
25bff4a2f0SMatthew G. Knepley 
26dbb368e6SPatrick Sanan   Notes:
27dbb368e6SPatrick Sanan   This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between
2887497f52SBarry Smith   processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`.
29bff4a2f0SMatthew G. Knepley 
3087497f52SBarry 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 .
31288e7d53SBarry Smith 
3295452b02SPatrick Sanan   Developer Notes:
3387497f52SBarry 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
34288e7d53SBarry Smith   as the 0th grid point where the physical boundary serves as the mirror?
35288e7d53SBarry Smith 
36dbb368e6SPatrick Sanan   References:
37606c0280SSatish Balay . * -  https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond
38288e7d53SBarry Smith 
39db781477SPatrick Sanan .seealso: `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;
4862a38674SMatthew G. Knepley /*E
499dc85fa5SMatthew G. Knepley   DMBoundaryConditionType - indicates what type of boundary condition is to be imposed
509dc85fa5SMatthew G. Knepley 
519dc85fa5SMatthew G. Knepley   Note: This flag indicates the type of function which will define the condition:
529dc85fa5SMatthew G. Knepley $ DM_BC_ESSENTIAL       - A Dirichlet condition using a function of the coordinates
539dc85fa5SMatthew G. Knepley $ DM_BC_ESSENTIAL_FIELD - A Dirichlet condition using a function of the coordinates and auxiliary field data
54b18799e0SMatthew G. Knepley $ DM_BC_ESSENTIAL_BD_FIELD - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data
559dc85fa5SMatthew G. Knepley $ DM_BC_NATURAL         - A Neumann condition using a function of the coordinates
56b18799e0SMatthew G. Knepley $ DM_BC_NATURAL_FIELD   - A Neumann condition using a function of the coordinates and auxiliary field data
579dc85fa5SMatthew G. Knepley $ DM_BC_NATURAL_RIEMANN - A flux condition which determines the state in ghost cells
589dc85fa5SMatthew G. Knepley The user can check whether a boundary condition is essential using (type & DM_BC_ESSENTIAL), and similarly for
599dc85fa5SMatthew G. Knepley natural conditions (type & DM_BC_NATURAL)
609dc85fa5SMatthew G. Knepley 
619dc85fa5SMatthew G. Knepley   Level: beginner
629dc85fa5SMatthew G. Knepley 
63db781477SPatrick Sanan .seealso: `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
649dc85fa5SMatthew G. Knepley E*/
659371c9d4SSatish Balay typedef enum {
669371c9d4SSatish Balay   DM_BC_ESSENTIAL          = 1,
679371c9d4SSatish Balay   DM_BC_ESSENTIAL_FIELD    = 5,
689371c9d4SSatish Balay   DM_BC_NATURAL            = 2,
699371c9d4SSatish Balay   DM_BC_NATURAL_FIELD      = 6,
709371c9d4SSatish Balay   DM_BC_ESSENTIAL_BD_FIELD = 9,
719371c9d4SSatish Balay   DM_BC_NATURAL_RIEMANN    = 10
729371c9d4SSatish Balay } DMBoundaryConditionType;
739dc85fa5SMatthew G. Knepley 
749dc85fa5SMatthew G. Knepley /*E
7562a38674SMatthew G. Knepley   DMPointLocationType - Describes the method to handle point location failure
7662a38674SMatthew G. Knepley 
7762a38674SMatthew G. Knepley   Level: beginner
7862a38674SMatthew G. Knepley 
7987497f52SBarry Smith   If a search using `DM_POINTLOCATION_NONE` fails, the failure is signaled with a negative cell number. On the
8087497f52SBarry Smith   other hand, if `DM_POINTLOCATION_NEAREST` is used, on failure, the (approximate) nearest point in the mesh is
8187497f52SBarry Smith   used, replacing the given point in the input vector. `DM_POINTLOCATION_REMOVE` returns values only for points
822d1fa6caSMatthew G. Knepley   which were located.
8362a38674SMatthew G. Knepley 
84db781477SPatrick Sanan .seealso: `DMLocatePoints()`
8562a38674SMatthew G. Knepley E*/
869371c9d4SSatish Balay typedef enum {
879371c9d4SSatish Balay   DM_POINTLOCATION_NONE,
889371c9d4SSatish Balay   DM_POINTLOCATION_NEAREST,
899371c9d4SSatish Balay   DM_POINTLOCATION_REMOVE
909371c9d4SSatish Balay } DMPointLocationType;
9162a38674SMatthew G. Knepley 
925675c177SMatthew G. Knepley /*E
93174e7490SMatthew G. Knepley   DMAdaptationStrategy - Describes the strategy used for adaptive solves
945675c177SMatthew G. Knepley 
955675c177SMatthew G. Knepley   Level: beginner
965675c177SMatthew G. Knepley 
9759b28e79SMatthew G. Knepley   DM_ADAPTATION_INITIAL will refine a mesh based on an initial guess. DM_ADAPTATION_SEQUENTIAL will refine the
9859b28e79SMatthew G. Knepley   mesh based on a sequence of solves, much like grid sequencing. DM_ADAPTATION_MULTILEVEL will use the sequence
9959b28e79SMatthew G. Knepley   of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt.
1005675c177SMatthew G. Knepley 
101db781477SPatrick Sanan .seealso: `DMAdaptorSolve()`
1025675c177SMatthew G. Knepley E*/
1039371c9d4SSatish Balay typedef enum {
1049371c9d4SSatish Balay   DM_ADAPTATION_INITIAL,
1059371c9d4SSatish Balay   DM_ADAPTATION_SEQUENTIAL,
1069371c9d4SSatish Balay   DM_ADAPTATION_MULTILEVEL
1079371c9d4SSatish Balay } DMAdaptationStrategy;
108174e7490SMatthew G. Knepley 
109174e7490SMatthew G. Knepley /*E
110174e7490SMatthew G. Knepley   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh
111174e7490SMatthew G. Knepley 
112174e7490SMatthew G. Knepley   Level: beginner
113174e7490SMatthew G. Knepley 
11487497f52SBarry Smith   `DM_ADAPTATION_REFINE` will uniformly refine a mesh, much like grid sequencing. `DM_ADAPTATION_LABEL` will adapt
11587497f52SBarry Smith   the mesh based upon a label of the cells filled with `DMAdaptFlag` markers. `DM_ADAPTATION_METRIC` will try to
116174e7490SMatthew G. Knepley   mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
117174e7490SMatthew G. Knepley   upon an input primal or a gradient field.
118174e7490SMatthew G. Knepley 
119db781477SPatrick Sanan .seealso: `DMAdaptorSolve()`
120174e7490SMatthew G. Knepley E*/
1219371c9d4SSatish Balay typedef enum {
1229371c9d4SSatish Balay   DM_ADAPTATION_NONE,
1239371c9d4SSatish Balay   DM_ADAPTATION_REFINE,
1249371c9d4SSatish Balay   DM_ADAPTATION_LABEL,
1259371c9d4SSatish Balay   DM_ADAPTATION_METRIC
1269371c9d4SSatish Balay } DMAdaptationCriterion;
1275675c177SMatthew G. Knepley 
1289dc85fa5SMatthew G. Knepley /*E
1299dc85fa5SMatthew G. Knepley   DMAdaptFlag - Marker in the label prescribing adaptation
1309dc85fa5SMatthew G. Knepley 
1319dc85fa5SMatthew G. Knepley   Level: beginner
1329dc85fa5SMatthew G. Knepley 
133db781477SPatrick Sanan .seealso: `DMAdaptLabel()`
1349dc85fa5SMatthew G. Knepley E*/
1359371c9d4SSatish Balay typedef enum {
1369371c9d4SSatish Balay   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
1379371c9d4SSatish Balay   DM_ADAPT_KEEP      = 0,
1389371c9d4SSatish Balay   DM_ADAPT_REFINE,
1399371c9d4SSatish Balay   DM_ADAPT_COARSEN,
1409371c9d4SSatish Balay   DM_ADAPT_COARSEN_LAST,
1419371c9d4SSatish Balay   DM_ADAPT_RESERVED_COUNT
1429371c9d4SSatish Balay } DMAdaptFlag;
1433ee9839eSMatthew G. Knepley 
1443ee9839eSMatthew G. Knepley /*E
1453ee9839eSMatthew G. Knepley   DMDirection - Indicates a coordinate direction
1463ee9839eSMatthew G. Knepley 
1473ee9839eSMatthew G. Knepley   Level: beginner
1483ee9839eSMatthew G. Knepley 
149db781477SPatrick Sanan .seealso: `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
1503ee9839eSMatthew G. Knepley E*/
1519371c9d4SSatish Balay typedef enum {
1529371c9d4SSatish Balay   DM_X,
1539371c9d4SSatish Balay   DM_Y,
1549371c9d4SSatish Balay   DM_Z
1559371c9d4SSatish Balay } DMDirection;
1569dc85fa5SMatthew G. Knepley 
157a6e0b375SMatthew G. Knepley /*E
15887497f52SBarry Smith   DMEnclosureType - The type of enclosure relation between one `DM` and another
159a6e0b375SMatthew G. Knepley 
160a6e0b375SMatthew G. Knepley   Level: beginner
161a6e0b375SMatthew G. Knepley 
16287497f52SBarry Smith   Notes:
16387497f52SBarry Smith   For example, one `DM` dmA may be the boundary of another dmB, in which case it would be labeled `DM_ENC_SUBMESH`.
16487497f52SBarry Smith 
16587497f52SBarry Smith   If the situation is reversed, and dmA has boundary dmB, it would be labeled `DM_ENC_SUPERMESH`.
16687497f52SBarry Smith 
16787497f52SBarry Smith   Likewise, if dmA was a subregion of dmB, it would be labeled `DM_ENC_SUBMESH`.
16887497f52SBarry Smith 
16987497f52SBarry Smith   If no relation can be determined, `DM_ENC_NONE` is used.
17087497f52SBarry Smith 
17187497f52SBarry Smith   If a relation is not yet known, then `DM_ENC_UNKNOWN` is used.
172a6e0b375SMatthew G. Knepley 
173db781477SPatrick Sanan .seealso: `DMGetEnclosureRelation()`
174a6e0b375SMatthew G. Knepley E*/
1759371c9d4SSatish Balay typedef enum {
1769371c9d4SSatish Balay   DM_ENC_EQUALITY,
1779371c9d4SSatish Balay   DM_ENC_SUPERMESH,
1789371c9d4SSatish Balay   DM_ENC_SUBMESH,
1799371c9d4SSatish Balay   DM_ENC_NONE,
1809371c9d4SSatish Balay   DM_ENC_UNKNOWN
1819371c9d4SSatish Balay } DMEnclosureType;
182ba2698f1SMatthew G. Knepley 
183ba2698f1SMatthew G. Knepley /*E
184ba2698f1SMatthew G. Knepley   DMPolytopeType - This describes the polytope represented by each cell.
185ba2698f1SMatthew G. Knepley 
186ba2698f1SMatthew G. Knepley   Level: beginner
187ba2698f1SMatthew G. Knepley 
18887497f52SBarry Smith   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
189ba2698f1SMatthew G. Knepley   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
19087497f52SBarry Smith   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
191ba2698f1SMatthew G. Knepley   constituent points. Normally these types are autoamtically inferred and the user does not specify
192ba2698f1SMatthew G. Knepley   them.
193ba2698f1SMatthew G. Knepley 
194db781477SPatrick Sanan .seealso: `DMPlexComputeCellTypes()`
195ba2698f1SMatthew G. Knepley E*/
1969371c9d4SSatish Balay typedef enum {
1979371c9d4SSatish Balay   DM_POLYTOPE_POINT,
1989371c9d4SSatish Balay   DM_POLYTOPE_SEGMENT,
1999371c9d4SSatish Balay   DM_POLYTOPE_POINT_PRISM_TENSOR,
2009371c9d4SSatish Balay   DM_POLYTOPE_TRIANGLE,
2019371c9d4SSatish Balay   DM_POLYTOPE_QUADRILATERAL,
2029371c9d4SSatish Balay   DM_POLYTOPE_SEG_PRISM_TENSOR,
2039371c9d4SSatish Balay   DM_POLYTOPE_TETRAHEDRON,
2049371c9d4SSatish Balay   DM_POLYTOPE_HEXAHEDRON,
2059371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM,
2069371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM_TENSOR,
2079371c9d4SSatish Balay   DM_POLYTOPE_QUAD_PRISM_TENSOR,
2089371c9d4SSatish Balay   DM_POLYTOPE_PYRAMID,
2099371c9d4SSatish Balay   DM_POLYTOPE_FV_GHOST,
2109371c9d4SSatish Balay   DM_POLYTOPE_INTERIOR_GHOST,
2119371c9d4SSatish Balay   DM_POLYTOPE_UNKNOWN,
2129371c9d4SSatish Balay   DM_NUM_POLYTOPES
2139371c9d4SSatish Balay } DMPolytopeType;
214ba2698f1SMatthew G. Knepley PETSC_EXTERN const char *const DMPolytopeTypes[];
215a6e0b375SMatthew G. Knepley 
2169dc85fa5SMatthew G. Knepley /*E
2179dc85fa5SMatthew G. Knepley   PetscUnit - The seven fundamental SI units
2189dc85fa5SMatthew G. Knepley 
2199dc85fa5SMatthew G. Knepley   Level: beginner
2209dc85fa5SMatthew G. Knepley 
221db781477SPatrick Sanan .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
2229dc85fa5SMatthew G. Knepley E*/
2239371c9d4SSatish Balay typedef enum {
2249371c9d4SSatish Balay   PETSC_UNIT_LENGTH,
2259371c9d4SSatish Balay   PETSC_UNIT_MASS,
2269371c9d4SSatish Balay   PETSC_UNIT_TIME,
2279371c9d4SSatish Balay   PETSC_UNIT_CURRENT,
2289371c9d4SSatish Balay   PETSC_UNIT_TEMPERATURE,
2299371c9d4SSatish Balay   PETSC_UNIT_AMOUNT,
2309371c9d4SSatish Balay   PETSC_UNIT_LUMINOSITY,
2319371c9d4SSatish Balay   NUM_PETSC_UNITS
2329371c9d4SSatish Balay } PetscUnit;
2339dc85fa5SMatthew G. Knepley 
234b2b58855SToby Isaac /*S
235b2b58855SToby Isaac     DMField - PETSc object for defining a field on a mesh topology
236b2b58855SToby Isaac 
237b2b58855SToby Isaac     Level: intermediate
238b2b58855SToby Isaac S*/
239b2b58855SToby Isaac typedef struct _p_DMField *DMField;
240b2b58855SToby Isaac 
2410fdc7489SMatthew Knepley /*S
24287497f52SBarry Smith     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively
2430fdc7489SMatthew Knepley 
2440fdc7489SMatthew Knepley     Level: developer
2450fdc7489SMatthew Knepley S*/
2460fdc7489SMatthew Knepley typedef struct _p_UniversalLabel *DMUniversalLabel;
2470fdc7489SMatthew Knepley 
248c0517cd5SMatthew G. Knepley typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;
249c0517cd5SMatthew G. Knepley 
2501e25c274SJed Brown #endif
251