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