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