xref: /petsc/include/petscdmtypes.h (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
126bd1501SBarry Smith #if !defined(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 
1187497f52SBarry Smith .seealso: `DMType`, `DMDGetType()`, `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*/
41*9371c9d4SSatish Balay typedef enum {
42*9371c9d4SSatish Balay   DM_BOUNDARY_NONE,
43*9371c9d4SSatish Balay   DM_BOUNDARY_GHOSTED,
44*9371c9d4SSatish Balay   DM_BOUNDARY_MIRROR,
45*9371c9d4SSatish Balay   DM_BOUNDARY_PERIODIC,
46*9371c9d4SSatish Balay   DM_BOUNDARY_TWIST
47*9371c9d4SSatish 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*/
65*9371c9d4SSatish Balay typedef enum {
66*9371c9d4SSatish Balay   DM_BC_ESSENTIAL          = 1,
67*9371c9d4SSatish Balay   DM_BC_ESSENTIAL_FIELD    = 5,
68*9371c9d4SSatish Balay   DM_BC_NATURAL            = 2,
69*9371c9d4SSatish Balay   DM_BC_NATURAL_FIELD      = 6,
70*9371c9d4SSatish Balay   DM_BC_ESSENTIAL_BD_FIELD = 9,
71*9371c9d4SSatish Balay   DM_BC_NATURAL_RIEMANN    = 10
72*9371c9d4SSatish 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*/
86*9371c9d4SSatish Balay typedef enum {
87*9371c9d4SSatish Balay   DM_POINTLOCATION_NONE,
88*9371c9d4SSatish Balay   DM_POINTLOCATION_NEAREST,
89*9371c9d4SSatish Balay   DM_POINTLOCATION_REMOVE
90*9371c9d4SSatish 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*/
103*9371c9d4SSatish Balay typedef enum {
104*9371c9d4SSatish Balay   DM_ADAPTATION_INITIAL,
105*9371c9d4SSatish Balay   DM_ADAPTATION_SEQUENTIAL,
106*9371c9d4SSatish Balay   DM_ADAPTATION_MULTILEVEL
107*9371c9d4SSatish 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*/
121*9371c9d4SSatish Balay typedef enum {
122*9371c9d4SSatish Balay   DM_ADAPTATION_NONE,
123*9371c9d4SSatish Balay   DM_ADAPTATION_REFINE,
124*9371c9d4SSatish Balay   DM_ADAPTATION_LABEL,
125*9371c9d4SSatish Balay   DM_ADAPTATION_METRIC
126*9371c9d4SSatish 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*/
135*9371c9d4SSatish Balay typedef enum {
136*9371c9d4SSatish Balay   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
137*9371c9d4SSatish Balay   DM_ADAPT_KEEP      = 0,
138*9371c9d4SSatish Balay   DM_ADAPT_REFINE,
139*9371c9d4SSatish Balay   DM_ADAPT_COARSEN,
140*9371c9d4SSatish Balay   DM_ADAPT_COARSEN_LAST,
141*9371c9d4SSatish Balay   DM_ADAPT_RESERVED_COUNT
142*9371c9d4SSatish 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*/
151*9371c9d4SSatish Balay typedef enum {
152*9371c9d4SSatish Balay   DM_X,
153*9371c9d4SSatish Balay   DM_Y,
154*9371c9d4SSatish Balay   DM_Z
155*9371c9d4SSatish 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*/
175*9371c9d4SSatish Balay typedef enum {
176*9371c9d4SSatish Balay   DM_ENC_EQUALITY,
177*9371c9d4SSatish Balay   DM_ENC_SUPERMESH,
178*9371c9d4SSatish Balay   DM_ENC_SUBMESH,
179*9371c9d4SSatish Balay   DM_ENC_NONE,
180*9371c9d4SSatish Balay   DM_ENC_UNKNOWN
181*9371c9d4SSatish 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*/
196*9371c9d4SSatish Balay typedef enum {
197*9371c9d4SSatish Balay   DM_POLYTOPE_POINT,
198*9371c9d4SSatish Balay   DM_POLYTOPE_SEGMENT,
199*9371c9d4SSatish Balay   DM_POLYTOPE_POINT_PRISM_TENSOR,
200*9371c9d4SSatish Balay   DM_POLYTOPE_TRIANGLE,
201*9371c9d4SSatish Balay   DM_POLYTOPE_QUADRILATERAL,
202*9371c9d4SSatish Balay   DM_POLYTOPE_SEG_PRISM_TENSOR,
203*9371c9d4SSatish Balay   DM_POLYTOPE_TETRAHEDRON,
204*9371c9d4SSatish Balay   DM_POLYTOPE_HEXAHEDRON,
205*9371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM,
206*9371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM_TENSOR,
207*9371c9d4SSatish Balay   DM_POLYTOPE_QUAD_PRISM_TENSOR,
208*9371c9d4SSatish Balay   DM_POLYTOPE_PYRAMID,
209*9371c9d4SSatish Balay   DM_POLYTOPE_FV_GHOST,
210*9371c9d4SSatish Balay   DM_POLYTOPE_INTERIOR_GHOST,
211*9371c9d4SSatish Balay   DM_POLYTOPE_UNKNOWN,
212*9371c9d4SSatish Balay   DM_NUM_POLYTOPES
213*9371c9d4SSatish 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*/
223*9371c9d4SSatish Balay typedef enum {
224*9371c9d4SSatish Balay   PETSC_UNIT_LENGTH,
225*9371c9d4SSatish Balay   PETSC_UNIT_MASS,
226*9371c9d4SSatish Balay   PETSC_UNIT_TIME,
227*9371c9d4SSatish Balay   PETSC_UNIT_CURRENT,
228*9371c9d4SSatish Balay   PETSC_UNIT_TEMPERATURE,
229*9371c9d4SSatish Balay   PETSC_UNIT_AMOUNT,
230*9371c9d4SSatish Balay   PETSC_UNIT_LUMINOSITY,
231*9371c9d4SSatish Balay   NUM_PETSC_UNITS
232*9371c9d4SSatish 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