xref: /petsc/include/petscdmtypes.h (revision 022ab154a4ee4f77bad574e56fe9a469a926dbf2)
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
90b4b7b1cSBarry Smith 
100b4b7b1cSBarry Smith    Note:
110b4b7b1cSBarry Smith    `DM` is an orphan initialism or orphan acronym, the letters have no meaning and never did.
121e25c274SJed Brown 
131cc06b55SBarry Smith .seealso: [](ch_dmbase), `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX`
141e25c274SJed Brown S*/
151e25c274SJed Brown typedef struct _p_DM *DM;
161e25c274SJed Brown 
17bff4a2f0SMatthew G. Knepley /*E
1816a05f60SBarry Smith   DMBoundaryType - Describes the choice for the filling of ghost cells on physical domain boundaries.
1916a05f60SBarry Smith 
2016a05f60SBarry Smith   Values:
2116a05f60SBarry Smith + `DM_BOUNDARY_NONE`     - no ghost nodes
2216a05f60SBarry 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
2316a05f60SBarry 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
2416a05f60SBarry Smith                            the ghost point value; not yet implemented for 3d
2516a05f60SBarry Smith . `DM_BOUNDARY_PERIODIC` - ghost vertices/cells filled by the opposite edge of the domain
2616a05f60SBarry Smith - `DM_BOUNDARY_TWIST`    - like periodic, only glued backwards like a Mobius strip
27bff4a2f0SMatthew G. Knepley 
28bff4a2f0SMatthew G. Knepley   Level: beginner
29bff4a2f0SMatthew G. Knepley 
30dbb368e6SPatrick Sanan   Notes:
31dbb368e6SPatrick Sanan   This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between
3287497f52SBarry Smith   processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`.
33bff4a2f0SMatthew G. Knepley 
3487497f52SBarry 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.
35288e7d53SBarry Smith 
361d27aa22SBarry Smith   See <https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond>
371d27aa22SBarry Smith 
3895bd0b28SBarry Smith   Developer Note:
39af27ebaaSBarry 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
40288e7d53SBarry Smith   as the 0th grid point where the physical boundary serves as the mirror?
41288e7d53SBarry Smith 
42af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMDA`, `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()`
43bff4a2f0SMatthew G. Knepley E*/
449371c9d4SSatish Balay typedef enum {
459371c9d4SSatish Balay   DM_BOUNDARY_NONE,
469371c9d4SSatish Balay   DM_BOUNDARY_GHOSTED,
479371c9d4SSatish Balay   DM_BOUNDARY_MIRROR,
489371c9d4SSatish Balay   DM_BOUNDARY_PERIODIC,
499371c9d4SSatish Balay   DM_BOUNDARY_TWIST
509371c9d4SSatish Balay } DMBoundaryType;
5116a05f60SBarry Smith 
5262a38674SMatthew G. Knepley /*E
539dc85fa5SMatthew G. Knepley   DMBoundaryConditionType - indicates what type of boundary condition is to be imposed
549dc85fa5SMatthew G. Knepley 
5516a05f60SBarry Smith   Values:
5616a05f60SBarry Smith + `DM_BC_ESSENTIAL`          - A Dirichlet condition using a function of the coordinates
5716a05f60SBarry Smith . `DM_BC_ESSENTIAL_FIELD`    - A Dirichlet condition using a function of the coordinates and auxiliary field data
5816a05f60SBarry Smith . `DM_BC_ESSENTIAL_BD_FIELD` - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data
5916a05f60SBarry Smith . `DM_BC_NATURAL`            - A Neumann condition using a function of the coordinates
6016a05f60SBarry Smith . `DM_BC_NATURAL_FIELD`      - A Neumann condition using a function of the coordinates and auxiliary field data
61*01468941SMatthew G. Knepley . `DM_BC_NATURAL_RIEMANN`    - A flux condition which determines the state in ghost cells
62*01468941SMatthew G. Knepley . `DM_BC_LOWER_BOUND`        - A lower bound on the solution along a boundary
63*01468941SMatthew G. Knepley - `DM_BC_UPPER_BOUND`        - An upper bound on the solution along a boundary
649dc85fa5SMatthew G. Knepley 
659dc85fa5SMatthew G. Knepley   Level: beginner
669dc85fa5SMatthew G. Knepley 
6716a05f60SBarry Smith   Note:
6816a05f60SBarry Smith   The user can check whether a boundary condition is essential using (type & `DM_BC_ESSENTIAL`), and similarly for
6916a05f60SBarry Smith   natural conditions (type & `DM_BC_NATURAL`)
7016a05f60SBarry Smith 
71af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
729dc85fa5SMatthew G. Knepley E*/
739371c9d4SSatish Balay typedef enum {
749371c9d4SSatish Balay   DM_BC_ESSENTIAL          = 1,
759371c9d4SSatish Balay   DM_BC_ESSENTIAL_FIELD    = 5,
769371c9d4SSatish Balay   DM_BC_NATURAL            = 2,
779371c9d4SSatish Balay   DM_BC_NATURAL_FIELD      = 6,
789371c9d4SSatish Balay   DM_BC_ESSENTIAL_BD_FIELD = 9,
79*01468941SMatthew G. Knepley   DM_BC_NATURAL_RIEMANN    = 10,
80*01468941SMatthew G. Knepley   DM_BC_LOWER_BOUND        = 4,
81*01468941SMatthew G. Knepley   DM_BC_UPPER_BOUND        = 8
829371c9d4SSatish Balay } DMBoundaryConditionType;
839dc85fa5SMatthew G. Knepley 
849dc85fa5SMatthew G. Knepley /*E
8562a38674SMatthew G. Knepley   DMPointLocationType - Describes the method to handle point location failure
8662a38674SMatthew G. Knepley 
8716a05f60SBarry Smith   Values:
8816a05f60SBarry Smith +  `DM_POINTLOCATION_NONE`    - return a negative cell number
8916a05f60SBarry Smith .  `DM_POINTLOCATION_NEAREST` - the (approximate) nearest point in the mesh is used
9016a05f60SBarry Smith -  `DM_POINTLOCATION_REMOVE`  - returns values only for points which were located
9162a38674SMatthew G. Knepley 
9216a05f60SBarry Smith   Level: intermediate
9362a38674SMatthew G. Knepley 
94af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMLocatePoints()`
9562a38674SMatthew G. Knepley E*/
969371c9d4SSatish Balay typedef enum {
979371c9d4SSatish Balay   DM_POINTLOCATION_NONE,
989371c9d4SSatish Balay   DM_POINTLOCATION_NEAREST,
999371c9d4SSatish Balay   DM_POINTLOCATION_REMOVE
1009371c9d4SSatish Balay } DMPointLocationType;
10162a38674SMatthew G. Knepley 
1025675c177SMatthew G. Knepley /*E
103863027abSJed Brown   DMBlockingType - Describes how to choose variable block sizes
104863027abSJed Brown 
10516a05f60SBarry Smith   Values:
10616a05f60SBarry Smith +  `DM_BLOCKING_TOPOLOGICAL_POINT` - select all fields at a topological point (cell center, at a face, etc)
10716a05f60SBarry Smith -  `DM_BLOCKING_FIELD_NODE`        - using a separate block for each field at a topological point
10816a05f60SBarry Smith 
109863027abSJed Brown   Level: intermediate
110863027abSJed Brown 
11116a05f60SBarry Smith   Note:
112863027abSJed Brown   When using `PCVPBJACOBI`, one can choose to block by topological point (all fields at a cell center, at a face, etc.)
113863027abSJed Brown   or by field nodes (using number of components per field to identify "nodes"). Field nodes lead to smaller blocks, but
114863027abSJed Brown   may converge more slowly. For example, a cubic Lagrange hexahedron will have one node at vertices, two at edges, four
115863027abSJed Brown   at faces, and eight at cell centers. If using point blocking, the `PCVPBJACOBI` preconditioner will work with block
116863027abSJed Brown   sizes up to 8 Lagrange nodes. For 5-component CFD, this produces matrices up to 40x40, which increases memory
11716a05f60SBarry Smith   footprint and may harm performance. With field node blocking, the maximum block size will correspond to one Lagrange node,
118863027abSJed Brown   or 5x5 blocks for the CFD example.
119863027abSJed Brown 
120af27ebaaSBarry Smith .seealso: [](ch_dmbase), `PCVPBJACOBI`, `MatSetVariableBlockSizes()`, `DMSetBlockingType()`
121863027abSJed Brown E*/
122863027abSJed Brown typedef enum {
1230e762ea3SJed Brown   DM_BLOCKING_TOPOLOGICAL_POINT,
124863027abSJed Brown   DM_BLOCKING_FIELD_NODE
125863027abSJed Brown } DMBlockingType;
126863027abSJed Brown 
127863027abSJed Brown /*E
128174e7490SMatthew G. Knepley   DMAdaptationStrategy - Describes the strategy used for adaptive solves
1295675c177SMatthew G. Knepley 
13016a05f60SBarry Smith   Values:
13116a05f60SBarry Smith +  `DM_ADAPTATION_INITIAL`    - refine a mesh based on an initial guess
13216a05f60SBarry Smith .  `DM_ADAPTATION_SEQUENTIAL` - refine the mesh based on a sequence of solves, much like grid sequencing
13316a05f60SBarry Smith -  `DM_ADAPTATION_MULTILEVEL` - use the sequence of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt
13416a05f60SBarry Smith 
1355675c177SMatthew G. Knepley   Level: beginner
1365675c177SMatthew G. Knepley 
137af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationCriterion`, `DMAdaptorSolve()`
1385675c177SMatthew G. Knepley E*/
1399371c9d4SSatish Balay typedef enum {
1409371c9d4SSatish Balay   DM_ADAPTATION_INITIAL,
1419371c9d4SSatish Balay   DM_ADAPTATION_SEQUENTIAL,
1429371c9d4SSatish Balay   DM_ADAPTATION_MULTILEVEL
1439371c9d4SSatish Balay } DMAdaptationStrategy;
144174e7490SMatthew G. Knepley 
145174e7490SMatthew G. Knepley /*E
146174e7490SMatthew G. Knepley   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh
147174e7490SMatthew G. Knepley 
14816a05f60SBarry Smith   Values:
14916a05f60SBarry Smith + `DM_ADAPTATION_REFINE` - uniformly refine a mesh, much like grid sequencing
15016a05f60SBarry Smith . `DM_ADAPTATION_LABEL`  - adapt the mesh based upon a label of the cells filled with `DMAdaptFlag` markers.
15116a05f60SBarry Smith . `DM_ADAPTATION_METRIC` - try to mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
15216a05f60SBarry Smith                            upon an input primal or a gradient field.
15316a05f60SBarry Smith - `DM_ADAPTATION_NONE`   - do no adaptation
15416a05f60SBarry Smith 
155174e7490SMatthew G. Knepley   Level: beginner
156174e7490SMatthew G. Knepley 
157af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptorSolve()`
158174e7490SMatthew G. Knepley E*/
1599371c9d4SSatish Balay typedef enum {
1609371c9d4SSatish Balay   DM_ADAPTATION_NONE,
1619371c9d4SSatish Balay   DM_ADAPTATION_REFINE,
1629371c9d4SSatish Balay   DM_ADAPTATION_LABEL,
1639371c9d4SSatish Balay   DM_ADAPTATION_METRIC
1649371c9d4SSatish Balay } DMAdaptationCriterion;
1658b724c91SMatthew G. Knepley PETSC_EXTERN const char *const DMAdaptationCriteria[];
1665675c177SMatthew G. Knepley 
1679dc85fa5SMatthew G. Knepley /*E
16816a05f60SBarry Smith   DMAdaptFlag - Marker in the label prescribing what adaptation to perform
16916a05f60SBarry Smith 
17016a05f60SBarry Smith   Values:
17116a05f60SBarry Smith +  `DM_ADAPT_DETERMINE`    - undocumented
17216a05f60SBarry Smith .  `DM_ADAPT_KEEP`         - undocumented
17316a05f60SBarry Smith .  `DM_ADAPT_REFINE`       - undocumented
17416a05f60SBarry Smith .  `DM_ADAPT_COARSEN`      - undocumented
17516a05f60SBarry Smith -  `DM_ADAPT_COARSEN_LAST` - undocumented
1769dc85fa5SMatthew G. Knepley 
1779dc85fa5SMatthew G. Knepley   Level: beginner
1789dc85fa5SMatthew G. Knepley 
179af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptationCriterion`, `DMAdaptorSolve()`, `DMAdaptLabel()`
1809dc85fa5SMatthew G. Knepley E*/
1819371c9d4SSatish Balay typedef enum {
1829371c9d4SSatish Balay   DM_ADAPT_DETERMINE      = PETSC_DETERMINE,
1839371c9d4SSatish Balay   DM_ADAPT_KEEP           = 0,
184ce78bad3SBarry Smith   DM_ADAPT_REFINE         = 1,
185ce78bad3SBarry Smith   DM_ADAPT_COARSEN        = 2,
186ce78bad3SBarry Smith   DM_ADAPT_COARSEN_LAST   = 3,
187ce78bad3SBarry Smith   DM_ADAPT_RESERVED_COUNT = 4
1889371c9d4SSatish Balay } DMAdaptFlag;
1893ee9839eSMatthew G. Knepley 
1903ee9839eSMatthew G. Knepley /*E
1913ee9839eSMatthew G. Knepley   DMDirection - Indicates a coordinate direction
1923ee9839eSMatthew G. Knepley 
19316a05f60SBarry Smith    Values:
19416a05f60SBarry Smith +  `DM_X` - the x coordinate direction
19516a05f60SBarry Smith .  `DM_Y` - the y coordinate direction
19616a05f60SBarry Smith -  `DM_Z` - the z coordinate direction
19716a05f60SBarry Smith 
1983ee9839eSMatthew G. Knepley   Level: beginner
1993ee9839eSMatthew G. Knepley 
200af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMDA`, `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
2013ee9839eSMatthew G. Knepley E*/
2029371c9d4SSatish Balay typedef enum {
2039371c9d4SSatish Balay   DM_X,
2049371c9d4SSatish Balay   DM_Y,
2059371c9d4SSatish Balay   DM_Z
2069371c9d4SSatish Balay } DMDirection;
2079dc85fa5SMatthew G. Knepley 
208a6e0b375SMatthew G. Knepley /*E
20987497f52SBarry Smith   DMEnclosureType - The type of enclosure relation between one `DM` and another
210a6e0b375SMatthew G. Knepley 
21116a05f60SBarry Smith    Values:
21216a05f60SBarry Smith +  `DM_ENC_SUBMESH`   - the `DM` is the boundary of another `DM`
21316a05f60SBarry Smith .  `DM_ENC_SUPERMESH` - the `DM` has the boundary of another `DM` (the reverse situation to `DM_ENC_SUBMESH`)
214af27ebaaSBarry Smith .  `DM_ENC_EQUALITY`  - it is unknown what this means
215f826b5fcSPierre Jolivet .  `DM_ENC_NONE`      - no relationship can be determined
21616a05f60SBarry Smith -  `DM_ENC_UNKNOWN`   - the relationship is unknown
21716a05f60SBarry Smith 
218a6e0b375SMatthew G. Knepley   Level: beginner
219a6e0b375SMatthew G. Knepley 
220af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMGetEnclosureRelation()`
221a6e0b375SMatthew G. Knepley E*/
2229371c9d4SSatish Balay typedef enum {
2239371c9d4SSatish Balay   DM_ENC_EQUALITY,
2249371c9d4SSatish Balay   DM_ENC_SUPERMESH,
2259371c9d4SSatish Balay   DM_ENC_SUBMESH,
2269371c9d4SSatish Balay   DM_ENC_NONE,
2279371c9d4SSatish Balay   DM_ENC_UNKNOWN
2289371c9d4SSatish Balay } DMEnclosureType;
229ba2698f1SMatthew G. Knepley 
230ba2698f1SMatthew G. Knepley /*E
231ba2698f1SMatthew G. Knepley   DMPolytopeType - This describes the polytope represented by each cell.
232ba2698f1SMatthew G. Knepley 
233ba2698f1SMatthew G. Knepley   Level: beginner
234ba2698f1SMatthew G. Knepley 
23587497f52SBarry Smith   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
236ba2698f1SMatthew G. Knepley   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
23787497f52SBarry Smith   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
2389c89aa79SPierre Jolivet   constituent points. Normally these types are automatically inferred and the user does not specify
239ba2698f1SMatthew G. Knepley   them.
240ba2698f1SMatthew G. Knepley 
241af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMPlexComputeCellTypes()`
242ba2698f1SMatthew G. Knepley E*/
2439371c9d4SSatish Balay typedef enum {
2449371c9d4SSatish Balay   DM_POLYTOPE_POINT,
2459371c9d4SSatish Balay   DM_POLYTOPE_SEGMENT,
2469371c9d4SSatish Balay   DM_POLYTOPE_POINT_PRISM_TENSOR,
2479371c9d4SSatish Balay   DM_POLYTOPE_TRIANGLE,
2489371c9d4SSatish Balay   DM_POLYTOPE_QUADRILATERAL,
2499371c9d4SSatish Balay   DM_POLYTOPE_SEG_PRISM_TENSOR,
2509371c9d4SSatish Balay   DM_POLYTOPE_TETRAHEDRON,
2519371c9d4SSatish Balay   DM_POLYTOPE_HEXAHEDRON,
2529371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM,
2539371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM_TENSOR,
2549371c9d4SSatish Balay   DM_POLYTOPE_QUAD_PRISM_TENSOR,
2559371c9d4SSatish Balay   DM_POLYTOPE_PYRAMID,
2569371c9d4SSatish Balay   DM_POLYTOPE_FV_GHOST,
2579371c9d4SSatish Balay   DM_POLYTOPE_INTERIOR_GHOST,
2589371c9d4SSatish Balay   DM_POLYTOPE_UNKNOWN,
259476787b7SMatthew G. Knepley   DM_POLYTOPE_UNKNOWN_CELL,
260476787b7SMatthew G. Knepley   DM_POLYTOPE_UNKNOWN_FACE,
2619371c9d4SSatish Balay   DM_NUM_POLYTOPES
2629371c9d4SSatish Balay } DMPolytopeType;
263ba2698f1SMatthew G. Knepley PETSC_EXTERN const char *const DMPolytopeTypes[];
264a6e0b375SMatthew G. Knepley 
2659dc85fa5SMatthew G. Knepley /*E
2669dc85fa5SMatthew G. Knepley   PetscUnit - The seven fundamental SI units
2679dc85fa5SMatthew G. Knepley 
2689dc85fa5SMatthew G. Knepley   Level: beginner
2699dc85fa5SMatthew G. Knepley 
270db781477SPatrick Sanan .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
2719dc85fa5SMatthew G. Knepley E*/
2729371c9d4SSatish Balay typedef enum {
2739371c9d4SSatish Balay   PETSC_UNIT_LENGTH,
2749371c9d4SSatish Balay   PETSC_UNIT_MASS,
2759371c9d4SSatish Balay   PETSC_UNIT_TIME,
2769371c9d4SSatish Balay   PETSC_UNIT_CURRENT,
2779371c9d4SSatish Balay   PETSC_UNIT_TEMPERATURE,
2789371c9d4SSatish Balay   PETSC_UNIT_AMOUNT,
2799371c9d4SSatish Balay   PETSC_UNIT_LUMINOSITY,
2809371c9d4SSatish Balay   NUM_PETSC_UNITS
2819371c9d4SSatish Balay } PetscUnit;
2829dc85fa5SMatthew G. Knepley 
283adc21957SMatthew G. Knepley /*E
284adc21957SMatthew G. Knepley    DMReorderDefaultFlag - Flag indicating whether the `DM` should be reordered by default
285adc21957SMatthew G. Knepley 
286adc21957SMatthew G. Knepley    Values:
287adc21957SMatthew G. Knepley +  `DM_REORDER_DEFAULT_NOTSET` - Flag not set.
288adc21957SMatthew G. Knepley .  `DM_REORDER_DEFAULT_FALSE`  - Do not reorder by default.
289adc21957SMatthew G. Knepley -  `DM_REORDER_DEFAULT_TRUE`   - Reorder by default.
290adc21957SMatthew G. Knepley 
291adc21957SMatthew G. Knepley    Level: intermediate
292adc21957SMatthew G. Knepley 
293adc21957SMatthew G. Knepley    Developer Note:
294adc21957SMatthew G. Knepley    Could be replaced with `PETSC_BOOL3`
295adc21957SMatthew G. Knepley 
296adc21957SMatthew G. Knepley .seealso: `DMPlexReorderSetDefault()`, `DMPlexReorderGetDefault()`, `DMPlexGetOrdering()`, `DMPlexPermute()`
297adc21957SMatthew G. Knepley E*/
298adc21957SMatthew G. Knepley typedef enum {
299adc21957SMatthew G. Knepley   DM_REORDER_DEFAULT_NOTSET = -1,
300adc21957SMatthew G. Knepley   DM_REORDER_DEFAULT_FALSE  = 0,
301ce78bad3SBarry Smith   DM_REORDER_DEFAULT_TRUE   = 1
302adc21957SMatthew G. Knepley } DMReorderDefaultFlag;
303adc21957SMatthew G. Knepley 
304b2b58855SToby Isaac /*S
305b2b58855SToby Isaac     DMField - PETSc object for defining a field on a mesh topology
306b2b58855SToby Isaac 
307b2b58855SToby Isaac     Level: intermediate
308af27ebaaSBarry Smith 
309af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMUniversalLabel`, `DMLabelCreate()`
310b2b58855SToby Isaac S*/
311b2b58855SToby Isaac typedef struct _p_DMField *DMField;
312b2b58855SToby Isaac 
3130fdc7489SMatthew Knepley /*S
31487497f52SBarry Smith     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively
3150fdc7489SMatthew Knepley 
3160fdc7489SMatthew Knepley     Level: developer
317af27ebaaSBarry Smith 
318af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMLabel`, `DMUniversalLabelCreate()`
3190fdc7489SMatthew Knepley S*/
3200fdc7489SMatthew Knepley typedef struct _p_UniversalLabel *DMUniversalLabel;
3210fdc7489SMatthew Knepley 
322d2b2dc1eSMatthew G. Knepley typedef struct _PETSc_DMCEED *DMCeed;
323d2b2dc1eSMatthew G. Knepley 
324c0517cd5SMatthew G. Knepley typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;
325