xref: /petsc/include/petscdmtypes.h (revision fbf9dbe564678ed6eff1806adbc4c4f01b9743f4)
1 #ifndef PETSCDMTYPES_H
2 #define PETSCDMTYPES_H
3 
4 /* SUBMANSEC = DM */
5 
6 /*S
7      DM - Abstract PETSc object that manages an abstract grid-like object and its interactions with the algebraic solvers
8 
9    Level: intermediate
10 
11 .seealso: [](ch_dmbase), `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX`
12 S*/
13 typedef struct _p_DM *DM;
14 
15 /*E
16   DMBoundaryType - Describes the choice for the filling of ghost cells on physical domain boundaries.
17 
18   Values:
19 + `DM_BOUNDARY_NONE` - no ghost nodes
20 . `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
21 . `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
22                          the ghost point value; not yet implemented for 3d
23 . `DM_BOUNDARY_PERIODIC` - ghost vertices/cells filled by the opposite edge of the domain
24 - `DM_BOUNDARY_TWIST` - like periodic, only glued backwards like a Mobius strip
25 
26   Level: beginner
27 
28   Notes:
29   This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between
30   processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`.
31 
32   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 .
33 
34   Developer Notes:
35     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
36   as the 0th grid point where the physical boundary serves as the mirror?
37 
38   References:
39 . * -  https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond
40 
41 .seealso: `DM`, `DMDA`, `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()`
42 E*/
43 typedef enum {
44   DM_BOUNDARY_NONE,
45   DM_BOUNDARY_GHOSTED,
46   DM_BOUNDARY_MIRROR,
47   DM_BOUNDARY_PERIODIC,
48   DM_BOUNDARY_TWIST
49 } DMBoundaryType;
50 
51 /*E
52   DMBoundaryConditionType - indicates what type of boundary condition is to be imposed
53 
54   Values:
55 + `DM_BC_ESSENTIAL`       - A Dirichlet condition using a function of the coordinates
56 . `DM_BC_ESSENTIAL_FIELD` - A Dirichlet condition using a function of the coordinates and auxiliary field data
57 . `DM_BC_ESSENTIAL_BD_FIELD` - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data
58 . `DM_BC_NATURAL`         - A Neumann condition using a function of the coordinates
59 . `DM_BC_NATURAL_FIELD`   - A Neumann condition using a function of the coordinates and auxiliary field data
60 - `DM_BC_NATURAL_RIEMANN` - A flux condition which determines the state in ghost cells
61 
62   Level: beginner
63 
64   Note:
65   The user can check whether a boundary condition is essential using (type & `DM_BC_ESSENTIAL`), and similarly for
66   natural conditions (type & `DM_BC_NATURAL`)
67 
68 .seealso: `DM`, `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
69 E*/
70 typedef enum {
71   DM_BC_ESSENTIAL          = 1,
72   DM_BC_ESSENTIAL_FIELD    = 5,
73   DM_BC_NATURAL            = 2,
74   DM_BC_NATURAL_FIELD      = 6,
75   DM_BC_ESSENTIAL_BD_FIELD = 9,
76   DM_BC_NATURAL_RIEMANN    = 10
77 } DMBoundaryConditionType;
78 
79 /*E
80   DMPointLocationType - Describes the method to handle point location failure
81 
82   Values:
83 +  `DM_POINTLOCATION_NONE` - return a negative cell number
84 .  `DM_POINTLOCATION_NEAREST` - the (approximate) nearest point in the mesh is used
85 -  `DM_POINTLOCATION_REMOVE` - returns values only for points which were located
86 
87   Level: intermediate
88 
89 .seealso: `DM`, `DMLocatePoints()`
90 E*/
91 typedef enum {
92   DM_POINTLOCATION_NONE,
93   DM_POINTLOCATION_NEAREST,
94   DM_POINTLOCATION_REMOVE
95 } DMPointLocationType;
96 
97 /*E
98   DMBlockingType - Describes how to choose variable block sizes
99 
100   Values:
101 +  `DM_BLOCKING_TOPOLOGICAL_POINT` - select all fields at a topological point (cell center, at a face, etc)
102 -  `DM_BLOCKING_FIELD_NODE` - using a separate block for each field at a topological point
103 
104   Level: intermediate
105 
106   Note:
107   When using `PCVPBJACOBI`, one can choose to block by topological point (all fields at a cell center, at a face, etc.)
108   or by field nodes (using number of components per field to identify "nodes"). Field nodes lead to smaller blocks, but
109   may converge more slowly. For example, a cubic Lagrange hexahedron will have one node at vertices, two at edges, four
110   at faces, and eight at cell centers. If using point blocking, the `PCVPBJACOBI` preconditioner will work with block
111   sizes up to 8 Lagrange nodes. For 5-component CFD, this produces matrices up to 40x40, which increases memory
112   footprint and may harm performance. With field node blocking, the maximum block size will correspond to one Lagrange node,
113   or 5x5 blocks for the CFD example.
114 
115 .seealso: `PCVPBJACOBI`, `MatSetVariableBlockSizes()`, `DMSetBlockingType()`
116 E*/
117 typedef enum {
118   DM_BLOCKING_TOPOLOGICAL_POINT,
119   DM_BLOCKING_FIELD_NODE
120 } DMBlockingType;
121 
122 /*E
123   DMAdaptationStrategy - Describes the strategy used for adaptive solves
124 
125   Values:
126 +  `DM_ADAPTATION_INITIAL` - refine a mesh based on an initial guess
127 .  `DM_ADAPTATION_SEQUENTIAL` - refine the mesh based on a sequence of solves, much like grid sequencing
128 -  `DM_ADAPTATION_MULTILEVEL` - use the sequence of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt
129 
130   Level: beginner
131 
132 .seealso: `DM`, `DMAdaptor`, `DMAdaptationCriterion`, `DMAdaptorSolve()`
133 E*/
134 typedef enum {
135   DM_ADAPTATION_INITIAL,
136   DM_ADAPTATION_SEQUENTIAL,
137   DM_ADAPTATION_MULTILEVEL
138 } DMAdaptationStrategy;
139 
140 /*E
141   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh
142 
143   Values:
144 + `DM_ADAPTATION_REFINE` - uniformly refine a mesh, much like grid sequencing
145 . `DM_ADAPTATION_LABEL` - adapt the mesh based upon a label of the cells filled with `DMAdaptFlag` markers.
146 . `DM_ADAPTATION_METRIC` - try to mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
147                            upon an input primal or a gradient field.
148 - `DM_ADAPTATION_NONE` - do no adaptation
149 
150   Level: beginner
151 
152 .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptorSolve()`
153 E*/
154 typedef enum {
155   DM_ADAPTATION_NONE,
156   DM_ADAPTATION_REFINE,
157   DM_ADAPTATION_LABEL,
158   DM_ADAPTATION_METRIC
159 } DMAdaptationCriterion;
160 
161 /*E
162   DMAdaptFlag - Marker in the label prescribing what adaptation to perform
163 
164   Values:
165 +  `DM_ADAPT_DETERMINE` - undocumented
166 .  `DM_ADAPT_KEEP` - undocumented
167 .  `DM_ADAPT_REFINE` - undocumented
168 .  `DM_ADAPT_COARSEN` - undocumented
169 -  `DM_ADAPT_COARSEN_LAST` - undocumented
170 
171   Level: beginner
172 
173 .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptationCriterion`, `DMAdaptorSolve()`, `DMAdaptLabel()`
174 E*/
175 typedef enum {
176   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
177   DM_ADAPT_KEEP      = 0,
178   DM_ADAPT_REFINE,
179   DM_ADAPT_COARSEN,
180   DM_ADAPT_COARSEN_LAST,
181   DM_ADAPT_RESERVED_COUNT
182 } DMAdaptFlag;
183 
184 /*E
185   DMDirection - Indicates a coordinate direction
186 
187    Values:
188 +  `DM_X` - the x coordinate direction
189 .  `DM_Y` - the y coordinate direction
190 -  `DM_Z` - the z coordinate direction
191 
192   Level: beginner
193 
194 .seealso: `DM`, `DMDA`, `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
195 E*/
196 typedef enum {
197   DM_X,
198   DM_Y,
199   DM_Z
200 } DMDirection;
201 
202 /*E
203   DMEnclosureType - The type of enclosure relation between one `DM` and another
204 
205    Values:
206 +  `DM_ENC_SUBMESH` - the `DM` is the boundary of another `DM`
207 .  `DM_ENC_SUPERMESH`  - the `DM` has the boundary of another `DM` (the reverse situation to `DM_ENC_SUBMESH`)
208 .  `DM_ENC_EQUALITY` - unknown what this means
209 .  `DM_ENC_NONE` - no relationship can be determined
210 -  `DM_ENC_UNKNOWN`  - the relationship is unknown
211 
212   Level: beginner
213 
214 .seealso: `DM`, `DMGetEnclosureRelation()`
215 E*/
216 typedef enum {
217   DM_ENC_EQUALITY,
218   DM_ENC_SUPERMESH,
219   DM_ENC_SUBMESH,
220   DM_ENC_NONE,
221   DM_ENC_UNKNOWN
222 } DMEnclosureType;
223 
224 /*E
225   DMPolytopeType - This describes the polytope represented by each cell.
226 
227   Level: beginner
228 
229   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
230   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
231   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
232   constituent points. Normally these types are automatically inferred and the user does not specify
233   them.
234 
235 .seealso: `DM`, `DMPlexComputeCellTypes()`
236 E*/
237 typedef enum {
238   DM_POLYTOPE_POINT,
239   DM_POLYTOPE_SEGMENT,
240   DM_POLYTOPE_POINT_PRISM_TENSOR,
241   DM_POLYTOPE_TRIANGLE,
242   DM_POLYTOPE_QUADRILATERAL,
243   DM_POLYTOPE_SEG_PRISM_TENSOR,
244   DM_POLYTOPE_TETRAHEDRON,
245   DM_POLYTOPE_HEXAHEDRON,
246   DM_POLYTOPE_TRI_PRISM,
247   DM_POLYTOPE_TRI_PRISM_TENSOR,
248   DM_POLYTOPE_QUAD_PRISM_TENSOR,
249   DM_POLYTOPE_PYRAMID,
250   DM_POLYTOPE_FV_GHOST,
251   DM_POLYTOPE_INTERIOR_GHOST,
252   DM_POLYTOPE_UNKNOWN,
253   DM_NUM_POLYTOPES
254 } DMPolytopeType;
255 PETSC_EXTERN const char *const DMPolytopeTypes[];
256 
257 /*E
258   PetscUnit - The seven fundamental SI units
259 
260   Level: beginner
261 
262 .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
263 E*/
264 typedef enum {
265   PETSC_UNIT_LENGTH,
266   PETSC_UNIT_MASS,
267   PETSC_UNIT_TIME,
268   PETSC_UNIT_CURRENT,
269   PETSC_UNIT_TEMPERATURE,
270   PETSC_UNIT_AMOUNT,
271   PETSC_UNIT_LUMINOSITY,
272   NUM_PETSC_UNITS
273 } PetscUnit;
274 
275 /*S
276     DMField - PETSc object for defining a field on a mesh topology
277 
278     Level: intermediate
279 S*/
280 typedef struct _p_DMField *DMField;
281 
282 /*S
283     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively
284 
285     Level: developer
286 S*/
287 typedef struct _p_UniversalLabel *DMUniversalLabel;
288 
289 typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;
290 
291 #endif
292