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 91e25c274SJed Brown 101cc06b55SBarry Smith .seealso: [](ch_dmbase), `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX` 111e25c274SJed Brown S*/ 121e25c274SJed Brown typedef struct _p_DM *DM; 131e25c274SJed Brown 14bff4a2f0SMatthew G. Knepley /*E 1516a05f60SBarry Smith DMBoundaryType - Describes the choice for the filling of ghost cells on physical domain boundaries. 1616a05f60SBarry Smith 1716a05f60SBarry Smith Values: 1816a05f60SBarry Smith + `DM_BOUNDARY_NONE` - no ghost nodes 1916a05f60SBarry 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 2016a05f60SBarry 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 2116a05f60SBarry Smith the ghost point value; not yet implemented for 3d 2216a05f60SBarry Smith . `DM_BOUNDARY_PERIODIC` - ghost vertices/cells filled by the opposite edge of the domain 2316a05f60SBarry Smith - `DM_BOUNDARY_TWIST` - like periodic, only glued backwards like a Mobius strip 24bff4a2f0SMatthew G. Knepley 25bff4a2f0SMatthew G. Knepley Level: beginner 26bff4a2f0SMatthew G. Knepley 27dbb368e6SPatrick Sanan Notes: 28dbb368e6SPatrick Sanan This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between 2987497f52SBarry Smith processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`. 30bff4a2f0SMatthew G. Knepley 3187497f52SBarry 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 . 32288e7d53SBarry Smith 3395452b02SPatrick Sanan Developer Notes: 3487497f52SBarry 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 35288e7d53SBarry Smith as the 0th grid point where the physical boundary serves as the mirror? 36288e7d53SBarry Smith 37dbb368e6SPatrick Sanan References: 38606c0280SSatish Balay . * - https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond 39288e7d53SBarry Smith 4016a05f60SBarry Smith .seealso: `DM`, `DMDA`, `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()` 41bff4a2f0SMatthew G. Knepley E*/ 429371c9d4SSatish Balay typedef enum { 439371c9d4SSatish Balay DM_BOUNDARY_NONE, 449371c9d4SSatish Balay DM_BOUNDARY_GHOSTED, 459371c9d4SSatish Balay DM_BOUNDARY_MIRROR, 469371c9d4SSatish Balay DM_BOUNDARY_PERIODIC, 479371c9d4SSatish Balay DM_BOUNDARY_TWIST 489371c9d4SSatish Balay } DMBoundaryType; 4916a05f60SBarry Smith 5062a38674SMatthew G. Knepley /*E 519dc85fa5SMatthew G. Knepley DMBoundaryConditionType - indicates what type of boundary condition is to be imposed 529dc85fa5SMatthew G. Knepley 5316a05f60SBarry Smith Values: 5416a05f60SBarry Smith + `DM_BC_ESSENTIAL` - A Dirichlet condition using a function of the coordinates 5516a05f60SBarry Smith . `DM_BC_ESSENTIAL_FIELD` - A Dirichlet condition using a function of the coordinates and auxiliary field data 5616a05f60SBarry Smith . `DM_BC_ESSENTIAL_BD_FIELD` - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data 5716a05f60SBarry Smith . `DM_BC_NATURAL` - A Neumann condition using a function of the coordinates 5816a05f60SBarry Smith . `DM_BC_NATURAL_FIELD` - A Neumann condition using a function of the coordinates and auxiliary field data 5916a05f60SBarry Smith - `DM_BC_NATURAL_RIEMANN` - A flux condition which determines the state in ghost cells 609dc85fa5SMatthew G. Knepley 619dc85fa5SMatthew G. Knepley Level: beginner 629dc85fa5SMatthew G. Knepley 6316a05f60SBarry Smith Note: 6416a05f60SBarry Smith The user can check whether a boundary condition is essential using (type & `DM_BC_ESSENTIAL`), and similarly for 6516a05f60SBarry Smith natural conditions (type & `DM_BC_NATURAL`) 6616a05f60SBarry Smith 6716a05f60SBarry Smith .seealso: `DM`, `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()` 689dc85fa5SMatthew G. Knepley E*/ 699371c9d4SSatish Balay typedef enum { 709371c9d4SSatish Balay DM_BC_ESSENTIAL = 1, 719371c9d4SSatish Balay DM_BC_ESSENTIAL_FIELD = 5, 729371c9d4SSatish Balay DM_BC_NATURAL = 2, 739371c9d4SSatish Balay DM_BC_NATURAL_FIELD = 6, 749371c9d4SSatish Balay DM_BC_ESSENTIAL_BD_FIELD = 9, 759371c9d4SSatish Balay DM_BC_NATURAL_RIEMANN = 10 769371c9d4SSatish Balay } DMBoundaryConditionType; 779dc85fa5SMatthew G. Knepley 789dc85fa5SMatthew G. Knepley /*E 7962a38674SMatthew G. Knepley DMPointLocationType - Describes the method to handle point location failure 8062a38674SMatthew G. Knepley 8116a05f60SBarry Smith Values: 8216a05f60SBarry Smith + `DM_POINTLOCATION_NONE` - return a negative cell number 8316a05f60SBarry Smith . `DM_POINTLOCATION_NEAREST` - the (approximate) nearest point in the mesh is used 8416a05f60SBarry Smith - `DM_POINTLOCATION_REMOVE` - returns values only for points which were located 8562a38674SMatthew G. Knepley 8616a05f60SBarry Smith Level: intermediate 8762a38674SMatthew G. Knepley 8816a05f60SBarry Smith .seealso: `DM`, `DMLocatePoints()` 8962a38674SMatthew G. Knepley E*/ 909371c9d4SSatish Balay typedef enum { 919371c9d4SSatish Balay DM_POINTLOCATION_NONE, 929371c9d4SSatish Balay DM_POINTLOCATION_NEAREST, 939371c9d4SSatish Balay DM_POINTLOCATION_REMOVE 949371c9d4SSatish Balay } DMPointLocationType; 9562a38674SMatthew G. Knepley 965675c177SMatthew G. Knepley /*E 97863027abSJed Brown DMBlockingType - Describes how to choose variable block sizes 98863027abSJed Brown 9916a05f60SBarry Smith Values: 10016a05f60SBarry Smith + `DM_BLOCKING_TOPOLOGICAL_POINT` - select all fields at a topological point (cell center, at a face, etc) 10116a05f60SBarry Smith - `DM_BLOCKING_FIELD_NODE` - using a separate block for each field at a topological point 10216a05f60SBarry Smith 103863027abSJed Brown Level: intermediate 104863027abSJed Brown 10516a05f60SBarry Smith Note: 106863027abSJed Brown When using `PCVPBJACOBI`, one can choose to block by topological point (all fields at a cell center, at a face, etc.) 107863027abSJed Brown or by field nodes (using number of components per field to identify "nodes"). Field nodes lead to smaller blocks, but 108863027abSJed Brown may converge more slowly. For example, a cubic Lagrange hexahedron will have one node at vertices, two at edges, four 109863027abSJed Brown at faces, and eight at cell centers. If using point blocking, the `PCVPBJACOBI` preconditioner will work with block 110863027abSJed Brown sizes up to 8 Lagrange nodes. For 5-component CFD, this produces matrices up to 40x40, which increases memory 11116a05f60SBarry Smith footprint and may harm performance. With field node blocking, the maximum block size will correspond to one Lagrange node, 112863027abSJed Brown or 5x5 blocks for the CFD example. 113863027abSJed Brown 114863027abSJed Brown .seealso: `PCVPBJACOBI`, `MatSetVariableBlockSizes()`, `DMSetBlockingType()` 115863027abSJed Brown E*/ 116863027abSJed Brown typedef enum { 1170e762ea3SJed Brown DM_BLOCKING_TOPOLOGICAL_POINT, 118863027abSJed Brown DM_BLOCKING_FIELD_NODE 119863027abSJed Brown } DMBlockingType; 120863027abSJed Brown 121863027abSJed Brown /*E 122174e7490SMatthew G. Knepley DMAdaptationStrategy - Describes the strategy used for adaptive solves 1235675c177SMatthew G. Knepley 12416a05f60SBarry Smith Values: 12516a05f60SBarry Smith + `DM_ADAPTATION_INITIAL` - refine a mesh based on an initial guess 12616a05f60SBarry Smith . `DM_ADAPTATION_SEQUENTIAL` - refine the mesh based on a sequence of solves, much like grid sequencing 12716a05f60SBarry Smith - `DM_ADAPTATION_MULTILEVEL` - use the sequence of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt 12816a05f60SBarry Smith 1295675c177SMatthew G. Knepley Level: beginner 1305675c177SMatthew G. Knepley 13116a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationCriterion`, `DMAdaptorSolve()` 1325675c177SMatthew G. Knepley E*/ 1339371c9d4SSatish Balay typedef enum { 1349371c9d4SSatish Balay DM_ADAPTATION_INITIAL, 1359371c9d4SSatish Balay DM_ADAPTATION_SEQUENTIAL, 1369371c9d4SSatish Balay DM_ADAPTATION_MULTILEVEL 1379371c9d4SSatish Balay } DMAdaptationStrategy; 138174e7490SMatthew G. Knepley 139174e7490SMatthew G. Knepley /*E 140174e7490SMatthew G. Knepley DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh 141174e7490SMatthew G. Knepley 14216a05f60SBarry Smith Values: 14316a05f60SBarry Smith + `DM_ADAPTATION_REFINE` - uniformly refine a mesh, much like grid sequencing 14416a05f60SBarry Smith . `DM_ADAPTATION_LABEL` - adapt the mesh based upon a label of the cells filled with `DMAdaptFlag` markers. 14516a05f60SBarry Smith . `DM_ADAPTATION_METRIC` - try to mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based 14616a05f60SBarry Smith upon an input primal or a gradient field. 14716a05f60SBarry Smith - `DM_ADAPTATION_NONE` - do no adaptation 14816a05f60SBarry Smith 149174e7490SMatthew G. Knepley Level: beginner 150174e7490SMatthew G. Knepley 15116a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptorSolve()` 152174e7490SMatthew G. Knepley E*/ 1539371c9d4SSatish Balay typedef enum { 1549371c9d4SSatish Balay DM_ADAPTATION_NONE, 1559371c9d4SSatish Balay DM_ADAPTATION_REFINE, 1569371c9d4SSatish Balay DM_ADAPTATION_LABEL, 1579371c9d4SSatish Balay DM_ADAPTATION_METRIC 1589371c9d4SSatish Balay } DMAdaptationCriterion; 1595675c177SMatthew G. Knepley 1609dc85fa5SMatthew G. Knepley /*E 16116a05f60SBarry Smith DMAdaptFlag - Marker in the label prescribing what adaptation to perform 16216a05f60SBarry Smith 16316a05f60SBarry Smith Values: 16416a05f60SBarry Smith + `DM_ADAPT_DETERMINE` - undocumented 16516a05f60SBarry Smith . `DM_ADAPT_KEEP` - undocumented 16616a05f60SBarry Smith . `DM_ADAPT_REFINE` - undocumented 16716a05f60SBarry Smith . `DM_ADAPT_COARSEN` - undocumented 16816a05f60SBarry Smith - `DM_ADAPT_COARSEN_LAST` - undocumented 1699dc85fa5SMatthew G. Knepley 1709dc85fa5SMatthew G. Knepley Level: beginner 1719dc85fa5SMatthew G. Knepley 17216a05f60SBarry Smith .seealso: `DM`, `DMAdaptor`, `DMAdaptationStrategy`, `DMAdaptationCriterion`, `DMAdaptorSolve()`, `DMAdaptLabel()` 1739dc85fa5SMatthew G. Knepley E*/ 1749371c9d4SSatish Balay typedef enum { 1759371c9d4SSatish Balay DM_ADAPT_DETERMINE = PETSC_DETERMINE, 1769371c9d4SSatish Balay DM_ADAPT_KEEP = 0, 1779371c9d4SSatish Balay DM_ADAPT_REFINE, 1789371c9d4SSatish Balay DM_ADAPT_COARSEN, 1799371c9d4SSatish Balay DM_ADAPT_COARSEN_LAST, 1809371c9d4SSatish Balay DM_ADAPT_RESERVED_COUNT 1819371c9d4SSatish Balay } DMAdaptFlag; 1823ee9839eSMatthew G. Knepley 1833ee9839eSMatthew G. Knepley /*E 1843ee9839eSMatthew G. Knepley DMDirection - Indicates a coordinate direction 1853ee9839eSMatthew G. Knepley 18616a05f60SBarry Smith Values: 18716a05f60SBarry Smith + `DM_X` - the x coordinate direction 18816a05f60SBarry Smith . `DM_Y` - the y coordinate direction 18916a05f60SBarry Smith - `DM_Z` - the z coordinate direction 19016a05f60SBarry Smith 1913ee9839eSMatthew G. Knepley Level: beginner 1923ee9839eSMatthew G. Knepley 19316a05f60SBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()` 1943ee9839eSMatthew G. Knepley E*/ 1959371c9d4SSatish Balay typedef enum { 1969371c9d4SSatish Balay DM_X, 1979371c9d4SSatish Balay DM_Y, 1989371c9d4SSatish Balay DM_Z 1999371c9d4SSatish Balay } DMDirection; 2009dc85fa5SMatthew G. Knepley 201a6e0b375SMatthew G. Knepley /*E 20287497f52SBarry Smith DMEnclosureType - The type of enclosure relation between one `DM` and another 203a6e0b375SMatthew G. Knepley 20416a05f60SBarry Smith Values: 20516a05f60SBarry Smith + `DM_ENC_SUBMESH` - the `DM` is the boundary of another `DM` 20616a05f60SBarry Smith . `DM_ENC_SUPERMESH` - the `DM` has the boundary of another `DM` (the reverse situation to `DM_ENC_SUBMESH`) 207f826b5fcSPierre Jolivet . `DM_ENC_EQUALITY` - unknown what this means 208f826b5fcSPierre Jolivet . `DM_ENC_NONE` - no relationship can be determined 20916a05f60SBarry Smith - `DM_ENC_UNKNOWN` - the relationship is unknown 21016a05f60SBarry Smith 211a6e0b375SMatthew G. Knepley Level: beginner 212a6e0b375SMatthew G. Knepley 21316a05f60SBarry Smith .seealso: `DM`, `DMGetEnclosureRelation()` 214a6e0b375SMatthew G. Knepley E*/ 2159371c9d4SSatish Balay typedef enum { 2169371c9d4SSatish Balay DM_ENC_EQUALITY, 2179371c9d4SSatish Balay DM_ENC_SUPERMESH, 2189371c9d4SSatish Balay DM_ENC_SUBMESH, 2199371c9d4SSatish Balay DM_ENC_NONE, 2209371c9d4SSatish Balay DM_ENC_UNKNOWN 2219371c9d4SSatish Balay } DMEnclosureType; 222ba2698f1SMatthew G. Knepley 223ba2698f1SMatthew G. Knepley /*E 224ba2698f1SMatthew G. Knepley DMPolytopeType - This describes the polytope represented by each cell. 225ba2698f1SMatthew G. Knepley 226ba2698f1SMatthew G. Knepley Level: beginner 227ba2698f1SMatthew G. Knepley 22887497f52SBarry Smith While most operations only need the topology information in the `DMPLEX`, we must sometimes have the 229ba2698f1SMatthew G. Knepley user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of 23087497f52SBarry Smith polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same 2319c89aa79SPierre Jolivet constituent points. Normally these types are automatically inferred and the user does not specify 232ba2698f1SMatthew G. Knepley them. 233ba2698f1SMatthew G. Knepley 23416a05f60SBarry Smith .seealso: `DM`, `DMPlexComputeCellTypes()` 235ba2698f1SMatthew G. Knepley E*/ 2369371c9d4SSatish Balay typedef enum { 2379371c9d4SSatish Balay DM_POLYTOPE_POINT, 2389371c9d4SSatish Balay DM_POLYTOPE_SEGMENT, 2399371c9d4SSatish Balay DM_POLYTOPE_POINT_PRISM_TENSOR, 2409371c9d4SSatish Balay DM_POLYTOPE_TRIANGLE, 2419371c9d4SSatish Balay DM_POLYTOPE_QUADRILATERAL, 2429371c9d4SSatish Balay DM_POLYTOPE_SEG_PRISM_TENSOR, 2439371c9d4SSatish Balay DM_POLYTOPE_TETRAHEDRON, 2449371c9d4SSatish Balay DM_POLYTOPE_HEXAHEDRON, 2459371c9d4SSatish Balay DM_POLYTOPE_TRI_PRISM, 2469371c9d4SSatish Balay DM_POLYTOPE_TRI_PRISM_TENSOR, 2479371c9d4SSatish Balay DM_POLYTOPE_QUAD_PRISM_TENSOR, 2489371c9d4SSatish Balay DM_POLYTOPE_PYRAMID, 2499371c9d4SSatish Balay DM_POLYTOPE_FV_GHOST, 2509371c9d4SSatish Balay DM_POLYTOPE_INTERIOR_GHOST, 2519371c9d4SSatish Balay DM_POLYTOPE_UNKNOWN, 2529371c9d4SSatish Balay DM_NUM_POLYTOPES 2539371c9d4SSatish Balay } DMPolytopeType; 254ba2698f1SMatthew G. Knepley PETSC_EXTERN const char *const DMPolytopeTypes[]; 255a6e0b375SMatthew G. Knepley 2569dc85fa5SMatthew G. Knepley /*E 2579dc85fa5SMatthew G. Knepley PetscUnit - The seven fundamental SI units 2589dc85fa5SMatthew G. Knepley 2599dc85fa5SMatthew G. Knepley Level: beginner 2609dc85fa5SMatthew G. Knepley 261db781477SPatrick Sanan .seealso: `DMPlexGetScale()`, `DMPlexSetScale()` 2629dc85fa5SMatthew G. Knepley E*/ 2639371c9d4SSatish Balay typedef enum { 2649371c9d4SSatish Balay PETSC_UNIT_LENGTH, 2659371c9d4SSatish Balay PETSC_UNIT_MASS, 2669371c9d4SSatish Balay PETSC_UNIT_TIME, 2679371c9d4SSatish Balay PETSC_UNIT_CURRENT, 2689371c9d4SSatish Balay PETSC_UNIT_TEMPERATURE, 2699371c9d4SSatish Balay PETSC_UNIT_AMOUNT, 2709371c9d4SSatish Balay PETSC_UNIT_LUMINOSITY, 2719371c9d4SSatish Balay NUM_PETSC_UNITS 2729371c9d4SSatish Balay } PetscUnit; 2739dc85fa5SMatthew G. Knepley 274b2b58855SToby Isaac /*S 275b2b58855SToby Isaac DMField - PETSc object for defining a field on a mesh topology 276b2b58855SToby Isaac 277b2b58855SToby Isaac Level: intermediate 278b2b58855SToby Isaac S*/ 279b2b58855SToby Isaac typedef struct _p_DMField *DMField; 280b2b58855SToby Isaac 2810fdc7489SMatthew Knepley /*S 28287497f52SBarry Smith DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively 2830fdc7489SMatthew Knepley 2840fdc7489SMatthew Knepley Level: developer 2850fdc7489SMatthew Knepley S*/ 2860fdc7489SMatthew Knepley typedef struct _p_UniversalLabel *DMUniversalLabel; 2870fdc7489SMatthew Knepley 288*d2b2dc1eSMatthew G. Knepley typedef struct _PETSc_DMCEED *DMCeed; 289*d2b2dc1eSMatthew G. Knepley 290c0517cd5SMatthew G. Knepley typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList; 291