xref: /petsc/include/petscdmtypes.h (revision 0b4b7b1c20c2ed4ade67e3d50a7710fe0ffbfca5)
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
9*0b4b7b1cSBarry Smith 
10*0b4b7b1cSBarry Smith    Note:
11*0b4b7b1cSBarry 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
6116a05f60SBarry Smith - `DM_BC_NATURAL_RIEMANN`    - A flux condition which determines the state in ghost cells
629dc85fa5SMatthew G. Knepley 
639dc85fa5SMatthew G. Knepley   Level: beginner
649dc85fa5SMatthew G. Knepley 
6516a05f60SBarry Smith   Note:
6616a05f60SBarry Smith   The user can check whether a boundary condition is essential using (type & `DM_BC_ESSENTIAL`), and similarly for
6716a05f60SBarry Smith   natural conditions (type & `DM_BC_NATURAL`)
6816a05f60SBarry Smith 
69af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
709dc85fa5SMatthew G. Knepley E*/
719371c9d4SSatish Balay typedef enum {
729371c9d4SSatish Balay   DM_BC_ESSENTIAL          = 1,
739371c9d4SSatish Balay   DM_BC_ESSENTIAL_FIELD    = 5,
749371c9d4SSatish Balay   DM_BC_NATURAL            = 2,
759371c9d4SSatish Balay   DM_BC_NATURAL_FIELD      = 6,
769371c9d4SSatish Balay   DM_BC_ESSENTIAL_BD_FIELD = 9,
779371c9d4SSatish Balay   DM_BC_NATURAL_RIEMANN    = 10
789371c9d4SSatish Balay } DMBoundaryConditionType;
799dc85fa5SMatthew G. Knepley 
809dc85fa5SMatthew G. Knepley /*E
8162a38674SMatthew G. Knepley   DMPointLocationType - Describes the method to handle point location failure
8262a38674SMatthew G. Knepley 
8316a05f60SBarry Smith   Values:
8416a05f60SBarry Smith +  `DM_POINTLOCATION_NONE`    - return a negative cell number
8516a05f60SBarry Smith .  `DM_POINTLOCATION_NEAREST` - the (approximate) nearest point in the mesh is used
8616a05f60SBarry Smith -  `DM_POINTLOCATION_REMOVE`  - returns values only for points which were located
8762a38674SMatthew G. Knepley 
8816a05f60SBarry Smith   Level: intermediate
8962a38674SMatthew G. Knepley 
90af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMLocatePoints()`
9162a38674SMatthew G. Knepley E*/
929371c9d4SSatish Balay typedef enum {
939371c9d4SSatish Balay   DM_POINTLOCATION_NONE,
949371c9d4SSatish Balay   DM_POINTLOCATION_NEAREST,
959371c9d4SSatish Balay   DM_POINTLOCATION_REMOVE
969371c9d4SSatish Balay } DMPointLocationType;
9762a38674SMatthew G. Knepley 
985675c177SMatthew G. Knepley /*E
99863027abSJed Brown   DMBlockingType - Describes how to choose variable block sizes
100863027abSJed Brown 
10116a05f60SBarry Smith   Values:
10216a05f60SBarry Smith +  `DM_BLOCKING_TOPOLOGICAL_POINT` - select all fields at a topological point (cell center, at a face, etc)
10316a05f60SBarry Smith -  `DM_BLOCKING_FIELD_NODE`        - using a separate block for each field at a topological point
10416a05f60SBarry Smith 
105863027abSJed Brown   Level: intermediate
106863027abSJed Brown 
10716a05f60SBarry Smith   Note:
108863027abSJed Brown   When using `PCVPBJACOBI`, one can choose to block by topological point (all fields at a cell center, at a face, etc.)
109863027abSJed Brown   or by field nodes (using number of components per field to identify "nodes"). Field nodes lead to smaller blocks, but
110863027abSJed Brown   may converge more slowly. For example, a cubic Lagrange hexahedron will have one node at vertices, two at edges, four
111863027abSJed Brown   at faces, and eight at cell centers. If using point blocking, the `PCVPBJACOBI` preconditioner will work with block
112863027abSJed Brown   sizes up to 8 Lagrange nodes. For 5-component CFD, this produces matrices up to 40x40, which increases memory
11316a05f60SBarry Smith   footprint and may harm performance. With field node blocking, the maximum block size will correspond to one Lagrange node,
114863027abSJed Brown   or 5x5 blocks for the CFD example.
115863027abSJed Brown 
116af27ebaaSBarry Smith .seealso: [](ch_dmbase), `PCVPBJACOBI`, `MatSetVariableBlockSizes()`, `DMSetBlockingType()`
117863027abSJed Brown E*/
118863027abSJed Brown typedef enum {
1190e762ea3SJed Brown   DM_BLOCKING_TOPOLOGICAL_POINT,
120863027abSJed Brown   DM_BLOCKING_FIELD_NODE
121863027abSJed Brown } DMBlockingType;
122863027abSJed Brown 
123863027abSJed Brown /*E
124174e7490SMatthew G. Knepley   DMAdaptationStrategy - Describes the strategy used for adaptive solves
1255675c177SMatthew G. Knepley 
12616a05f60SBarry Smith   Values:
12716a05f60SBarry Smith +  `DM_ADAPTATION_INITIAL`    - refine a mesh based on an initial guess
12816a05f60SBarry Smith .  `DM_ADAPTATION_SEQUENTIAL` - refine the mesh based on a sequence of solves, much like grid sequencing
12916a05f60SBarry Smith -  `DM_ADAPTATION_MULTILEVEL` - use the sequence of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt
13016a05f60SBarry Smith 
1315675c177SMatthew G. Knepley   Level: beginner
1325675c177SMatthew G. Knepley 
133af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationCriterion`, `DMAdaptorSolve()`
1345675c177SMatthew G. Knepley E*/
1359371c9d4SSatish Balay typedef enum {
1369371c9d4SSatish Balay   DM_ADAPTATION_INITIAL,
1379371c9d4SSatish Balay   DM_ADAPTATION_SEQUENTIAL,
1389371c9d4SSatish Balay   DM_ADAPTATION_MULTILEVEL
1399371c9d4SSatish Balay } DMAdaptationStrategy;
140174e7490SMatthew G. Knepley 
141174e7490SMatthew G. Knepley /*E
142174e7490SMatthew G. Knepley   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh
143174e7490SMatthew G. Knepley 
14416a05f60SBarry Smith   Values:
14516a05f60SBarry Smith + `DM_ADAPTATION_REFINE` - uniformly refine a mesh, much like grid sequencing
14616a05f60SBarry Smith . `DM_ADAPTATION_LABEL`  - adapt the mesh based upon a label of the cells filled with `DMAdaptFlag` markers.
14716a05f60SBarry Smith . `DM_ADAPTATION_METRIC` - try to mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
14816a05f60SBarry Smith                            upon an input primal or a gradient field.
14916a05f60SBarry Smith - `DM_ADAPTATION_NONE`   - do no adaptation
15016a05f60SBarry Smith 
151174e7490SMatthew G. Knepley   Level: beginner
152174e7490SMatthew G. Knepley 
153af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptorSolve()`
154174e7490SMatthew G. Knepley E*/
1559371c9d4SSatish Balay typedef enum {
1569371c9d4SSatish Balay   DM_ADAPTATION_NONE,
1579371c9d4SSatish Balay   DM_ADAPTATION_REFINE,
1589371c9d4SSatish Balay   DM_ADAPTATION_LABEL,
1599371c9d4SSatish Balay   DM_ADAPTATION_METRIC
1609371c9d4SSatish Balay } DMAdaptationCriterion;
1618b724c91SMatthew G. Knepley PETSC_EXTERN const char *const DMAdaptationCriteria[];
1625675c177SMatthew G. Knepley 
1639dc85fa5SMatthew G. Knepley /*E
16416a05f60SBarry Smith   DMAdaptFlag - Marker in the label prescribing what adaptation to perform
16516a05f60SBarry Smith 
16616a05f60SBarry Smith   Values:
16716a05f60SBarry Smith +  `DM_ADAPT_DETERMINE`    - undocumented
16816a05f60SBarry Smith .  `DM_ADAPT_KEEP`         - undocumented
16916a05f60SBarry Smith .  `DM_ADAPT_REFINE`       - undocumented
17016a05f60SBarry Smith .  `DM_ADAPT_COARSEN`      - undocumented
17116a05f60SBarry Smith -  `DM_ADAPT_COARSEN_LAST` - undocumented
1729dc85fa5SMatthew G. Knepley 
1739dc85fa5SMatthew G. Knepley   Level: beginner
1749dc85fa5SMatthew G. Knepley 
175af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptationCriterion`, `DMAdaptorSolve()`, `DMAdaptLabel()`
1769dc85fa5SMatthew G. Knepley E*/
1779371c9d4SSatish Balay typedef enum {
1789371c9d4SSatish Balay   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
1799371c9d4SSatish Balay   DM_ADAPT_KEEP      = 0,
1809371c9d4SSatish Balay   DM_ADAPT_REFINE,
1819371c9d4SSatish Balay   DM_ADAPT_COARSEN,
1829371c9d4SSatish Balay   DM_ADAPT_COARSEN_LAST,
1839371c9d4SSatish Balay   DM_ADAPT_RESERVED_COUNT
1849371c9d4SSatish Balay } DMAdaptFlag;
1853ee9839eSMatthew G. Knepley 
1863ee9839eSMatthew G. Knepley /*E
1873ee9839eSMatthew G. Knepley   DMDirection - Indicates a coordinate direction
1883ee9839eSMatthew G. Knepley 
18916a05f60SBarry Smith    Values:
19016a05f60SBarry Smith +  `DM_X` - the x coordinate direction
19116a05f60SBarry Smith .  `DM_Y` - the y coordinate direction
19216a05f60SBarry Smith -  `DM_Z` - the z coordinate direction
19316a05f60SBarry Smith 
1943ee9839eSMatthew G. Knepley   Level: beginner
1953ee9839eSMatthew G. Knepley 
196af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMDA`, `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
1973ee9839eSMatthew G. Knepley E*/
1989371c9d4SSatish Balay typedef enum {
1999371c9d4SSatish Balay   DM_X,
2009371c9d4SSatish Balay   DM_Y,
2019371c9d4SSatish Balay   DM_Z
2029371c9d4SSatish Balay } DMDirection;
2039dc85fa5SMatthew G. Knepley 
204a6e0b375SMatthew G. Knepley /*E
20587497f52SBarry Smith   DMEnclosureType - The type of enclosure relation between one `DM` and another
206a6e0b375SMatthew G. Knepley 
20716a05f60SBarry Smith    Values:
20816a05f60SBarry Smith +  `DM_ENC_SUBMESH`   - the `DM` is the boundary of another `DM`
20916a05f60SBarry Smith .  `DM_ENC_SUPERMESH` - the `DM` has the boundary of another `DM` (the reverse situation to `DM_ENC_SUBMESH`)
210af27ebaaSBarry Smith .  `DM_ENC_EQUALITY`  - it is unknown what this means
211f826b5fcSPierre Jolivet .  `DM_ENC_NONE`      - no relationship can be determined
21216a05f60SBarry Smith -  `DM_ENC_UNKNOWN`   - the relationship is unknown
21316a05f60SBarry Smith 
214a6e0b375SMatthew G. Knepley   Level: beginner
215a6e0b375SMatthew G. Knepley 
216af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMGetEnclosureRelation()`
217a6e0b375SMatthew G. Knepley E*/
2189371c9d4SSatish Balay typedef enum {
2199371c9d4SSatish Balay   DM_ENC_EQUALITY,
2209371c9d4SSatish Balay   DM_ENC_SUPERMESH,
2219371c9d4SSatish Balay   DM_ENC_SUBMESH,
2229371c9d4SSatish Balay   DM_ENC_NONE,
2239371c9d4SSatish Balay   DM_ENC_UNKNOWN
2249371c9d4SSatish Balay } DMEnclosureType;
225ba2698f1SMatthew G. Knepley 
226ba2698f1SMatthew G. Knepley /*E
227ba2698f1SMatthew G. Knepley   DMPolytopeType - This describes the polytope represented by each cell.
228ba2698f1SMatthew G. Knepley 
229ba2698f1SMatthew G. Knepley   Level: beginner
230ba2698f1SMatthew G. Knepley 
23187497f52SBarry Smith   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
232ba2698f1SMatthew G. Knepley   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
23387497f52SBarry Smith   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
2349c89aa79SPierre Jolivet   constituent points. Normally these types are automatically inferred and the user does not specify
235ba2698f1SMatthew G. Knepley   them.
236ba2698f1SMatthew G. Knepley 
237af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMPlexComputeCellTypes()`
238ba2698f1SMatthew G. Knepley E*/
2399371c9d4SSatish Balay typedef enum {
2409371c9d4SSatish Balay   DM_POLYTOPE_POINT,
2419371c9d4SSatish Balay   DM_POLYTOPE_SEGMENT,
2429371c9d4SSatish Balay   DM_POLYTOPE_POINT_PRISM_TENSOR,
2439371c9d4SSatish Balay   DM_POLYTOPE_TRIANGLE,
2449371c9d4SSatish Balay   DM_POLYTOPE_QUADRILATERAL,
2459371c9d4SSatish Balay   DM_POLYTOPE_SEG_PRISM_TENSOR,
2469371c9d4SSatish Balay   DM_POLYTOPE_TETRAHEDRON,
2479371c9d4SSatish Balay   DM_POLYTOPE_HEXAHEDRON,
2489371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM,
2499371c9d4SSatish Balay   DM_POLYTOPE_TRI_PRISM_TENSOR,
2509371c9d4SSatish Balay   DM_POLYTOPE_QUAD_PRISM_TENSOR,
2519371c9d4SSatish Balay   DM_POLYTOPE_PYRAMID,
2529371c9d4SSatish Balay   DM_POLYTOPE_FV_GHOST,
2539371c9d4SSatish Balay   DM_POLYTOPE_INTERIOR_GHOST,
2549371c9d4SSatish Balay   DM_POLYTOPE_UNKNOWN,
255476787b7SMatthew G. Knepley   DM_POLYTOPE_UNKNOWN_CELL,
256476787b7SMatthew G. Knepley   DM_POLYTOPE_UNKNOWN_FACE,
2579371c9d4SSatish Balay   DM_NUM_POLYTOPES
2589371c9d4SSatish Balay } DMPolytopeType;
259ba2698f1SMatthew G. Knepley PETSC_EXTERN const char *const DMPolytopeTypes[];
260a6e0b375SMatthew G. Knepley 
2619dc85fa5SMatthew G. Knepley /*E
2629dc85fa5SMatthew G. Knepley   PetscUnit - The seven fundamental SI units
2639dc85fa5SMatthew G. Knepley 
2649dc85fa5SMatthew G. Knepley   Level: beginner
2659dc85fa5SMatthew G. Knepley 
266db781477SPatrick Sanan .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
2679dc85fa5SMatthew G. Knepley E*/
2689371c9d4SSatish Balay typedef enum {
2699371c9d4SSatish Balay   PETSC_UNIT_LENGTH,
2709371c9d4SSatish Balay   PETSC_UNIT_MASS,
2719371c9d4SSatish Balay   PETSC_UNIT_TIME,
2729371c9d4SSatish Balay   PETSC_UNIT_CURRENT,
2739371c9d4SSatish Balay   PETSC_UNIT_TEMPERATURE,
2749371c9d4SSatish Balay   PETSC_UNIT_AMOUNT,
2759371c9d4SSatish Balay   PETSC_UNIT_LUMINOSITY,
2769371c9d4SSatish Balay   NUM_PETSC_UNITS
2779371c9d4SSatish Balay } PetscUnit;
2789dc85fa5SMatthew G. Knepley 
279adc21957SMatthew G. Knepley /*E
280adc21957SMatthew G. Knepley    DMReorderDefaultFlag - Flag indicating whether the `DM` should be reordered by default
281adc21957SMatthew G. Knepley 
282adc21957SMatthew G. Knepley    Values:
283adc21957SMatthew G. Knepley +  `DM_REORDER_DEFAULT_NOTSET` - Flag not set.
284adc21957SMatthew G. Knepley .  `DM_REORDER_DEFAULT_FALSE`  - Do not reorder by default.
285adc21957SMatthew G. Knepley -  `DM_REORDER_DEFAULT_TRUE`   - Reorder by default.
286adc21957SMatthew G. Knepley 
287adc21957SMatthew G. Knepley    Level: intermediate
288adc21957SMatthew G. Knepley 
289adc21957SMatthew G. Knepley    Developer Note:
290adc21957SMatthew G. Knepley    Could be replaced with `PETSC_BOOL3`
291adc21957SMatthew G. Knepley 
292adc21957SMatthew G. Knepley .seealso: `DMPlexReorderSetDefault()`, `DMPlexReorderGetDefault()`, `DMPlexGetOrdering()`, `DMPlexPermute()`
293adc21957SMatthew G. Knepley E*/
294adc21957SMatthew G. Knepley typedef enum {
295adc21957SMatthew G. Knepley   DM_REORDER_DEFAULT_NOTSET = -1,
296adc21957SMatthew G. Knepley   DM_REORDER_DEFAULT_FALSE  = 0,
297adc21957SMatthew G. Knepley   DM_REORDER_DEFAULT_TRUE
298adc21957SMatthew G. Knepley } DMReorderDefaultFlag;
299adc21957SMatthew G. Knepley 
300b2b58855SToby Isaac /*S
301b2b58855SToby Isaac     DMField - PETSc object for defining a field on a mesh topology
302b2b58855SToby Isaac 
303b2b58855SToby Isaac     Level: intermediate
304af27ebaaSBarry Smith 
305af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMUniversalLabel`, `DMLabelCreate()`
306b2b58855SToby Isaac S*/
307b2b58855SToby Isaac typedef struct _p_DMField *DMField;
308b2b58855SToby Isaac 
3090fdc7489SMatthew Knepley /*S
31087497f52SBarry Smith     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively
3110fdc7489SMatthew Knepley 
3120fdc7489SMatthew Knepley     Level: developer
313af27ebaaSBarry Smith 
314af27ebaaSBarry Smith .seealso: [](ch_dmbase), `DM`, `DMLabel`, `DMUniversalLabelCreate()`
3150fdc7489SMatthew Knepley S*/
3160fdc7489SMatthew Knepley typedef struct _p_UniversalLabel *DMUniversalLabel;
3170fdc7489SMatthew Knepley 
318d2b2dc1eSMatthew G. Knepley typedef struct _PETSc_DMCEED *DMCeed;
319d2b2dc1eSMatthew G. Knepley 
320c0517cd5SMatthew G. Knepley typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;
321