1: #if !defined(PETSCDMTYPES_H) 2:#define PETSCDMTYPES_H4: /* SUBMANSEC = DM */ 6: /*S 7: DM - Abstract PETSc object that manages an abstract grid object and its interactions with the algebraic solvers 9: Level: intermediate 11: Notes: 12: The DMDACreate() based object and the DMCompositeCreate() based object are examples of DMs 14: .seealso: `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType` 15: S*/ 16: typedef struct _p_DM* DM; 18: /*E 19: DMBoundaryType - Describes the choice for fill of ghost cells on physical domain boundaries. 21: Level: beginner 23: A boundary may be of type DM_BOUNDARY_NONE (no ghost nodes), DM_BOUNDARY_GHOSTED (ghost vertices/cells 24: exist but aren't filled; you can put values into them and then apply a stencil that uses those ghost locations), 25: 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 the ghost point value; 26: not yet implemented for 3d), DM_BOUNDARY_PERIODIC (ghost vertices/cells filled by the opposite 27: edge of the domain), or DM_BOUNDARY_TWIST (like periodic, only glued backwards like a Mobius strip). 29: Notes: 30: This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between 31: processes. That width is always determined by the stencil width; see DMDASetStencilWidth(). 33: 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 . 35: Developer Notes: 36: 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 37: as the 0th grid point where the physical boundary serves as the mirror? 39: References: 40: . * - https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond 42: .seealso: `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()` 43: E*/ 44: typedef enum {DM_BOUNDARY_NONE, DM_BOUNDARY_GHOSTED, DM_BOUNDARY_MIRROR, DM_BOUNDARY_PERIODIC, DM_BOUNDARY_TWIST} DMBoundaryType; 45: /*E 46: DMBoundaryConditionType - indicates what type of boundary condition is to be imposed 48: Note: This flag indicates the type of function which will define the condition: 49: $ DM_BC_ESSENTIAL - A Dirichlet condition using a function of the coordinates 50: $ DM_BC_ESSENTIAL_FIELD - A Dirichlet condition using a function of the coordinates and auxiliary field data 51: $ DM_BC_ESSENTIAL_BD_FIELD - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data 52: $ DM_BC_NATURAL - A Neumann condition using a function of the coordinates 53: $ DM_BC_NATURAL_FIELD - A Neumann condition using a function of the coordinates and auxiliary field data 54: $ DM_BC_NATURAL_RIEMANN - A flux condition which determines the state in ghost cells 55: The user can check whether a boundary condition is essential using (type & DM_BC_ESSENTIAL), and similarly for 56: natural conditions (type & DM_BC_NATURAL) 58: Level: beginner 60: .seealso: `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()` 61: E*/ 62: typedef enum {DM_BC_ESSENTIAL = 1, DM_BC_ESSENTIAL_FIELD = 5, DM_BC_NATURAL = 2, DM_BC_NATURAL_FIELD = 6, DM_BC_ESSENTIAL_BD_FIELD = 9, DM_BC_NATURAL_RIEMANN = 10} DMBoundaryConditionType; 64: /*E 65: DMPointLocationType - Describes the method to handle point location failure 67: Level: beginner 69: If a search using DM_POINTLOCATION_NONE fails, the failure is signaled with a negative cell number. On the 70: other hand, if DM_POINTLOCATION_NEAREST is used, on failure, the (approximate) nearest point in the mesh is 71: used, replacing the given point in the input vector. DM_POINTLOCATION_REMOVE returns values only for points 72: which were located. 74: .seealso: `DMLocatePoints()` 75: E*/ 76: typedef enum {DM_POINTLOCATION_NONE, DM_POINTLOCATION_NEAREST, DM_POINTLOCATION_REMOVE} DMPointLocationType; 78: /*E 79: DMAdaptationStrategy - Describes the strategy used for adaptive solves 81: Level: beginner 83: DM_ADAPTATION_INITIAL will refine a mesh based on an initial guess. DM_ADAPTATION_SEQUENTIAL will refine the 84: mesh based on a sequence of solves, much like grid sequencing. DM_ADAPTATION_MULTILEVEL will use the sequence 85: of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt. 87: .seealso: `DMAdaptorSolve()` 88: E*/ 89: typedef enum {DM_ADAPTATION_INITIAL, DM_ADAPTATION_SEQUENTIAL, DM_ADAPTATION_MULTILEVEL} DMAdaptationStrategy; 91: /*E 92: DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh 94: Level: beginner 96: DM_ADAPTATION_REFINE will uniformly refine a mesh, much like grid sequencing. DM_ADAPTATION_LABEL will adapt 97: the mesh based upon a label of the cells filled with DMAdaptFlag markers. DM_ADAPTATION_METRIC will try to 98: mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based 99: upon an input primal or a gradient field. 101: .seealso: `DMAdaptorSolve()` 102: E*/ 103: typedef enum {DM_ADAPTATION_NONE, DM_ADAPTATION_REFINE, DM_ADAPTATION_LABEL, DM_ADAPTATION_METRIC} DMAdaptationCriterion; 105: /*E 106: DMAdaptFlag - Marker in the label prescribing adaptation 108: Level: beginner 110: .seealso: `DMAdaptLabel()` 111: E*/ 112: typedef enum {DM_ADAPT_DETERMINE = PETSC_DETERMINE, DM_ADAPT_KEEP = 0, DM_ADAPT_REFINE, DM_ADAPT_COARSEN, DM_ADAPT_COARSEN_LAST, DM_ADAPT_RESERVED_COUNT} DMAdaptFlag; 114: /*E 115: DMDirection - Indicates a coordinate direction 117: Level: beginner 119: .seealso: `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()` 120: E*/ 121: typedef enum {DM_X, DM_Y, DM_Z} DMDirection; 123: /*E 124: DMEnclosureType - The type of enclosure relation between one DM and another 126: Level: beginner 128: For example, one DM dmA may be the boundary of another dmB, in which case it would be labeled DM_ENC_SUBMESH. If 129: the situation is reversed, and dmA has boundary dmB, it would be labeled DM_ENC_SUPERMESH. Likewise, if dmA was 130: a subregion of dmB, it would be labeled DM_ENC_SUBMESH. If no relation can be determined, DM_ENC_NONE is used. 131: If a relation is not yet known, then DM_ENC_UNKNOWN is used. 133: .seealso: `DMGetEnclosureRelation()` 134: E*/ 135: typedef enum {DM_ENC_EQUALITY, DM_ENC_SUPERMESH, DM_ENC_SUBMESH, DM_ENC_NONE, DM_ENC_UNKNOWN} DMEnclosureType; 137: /*E 138: DMPolytopeType - This describes the polytope represented by each cell. 140: Level: beginner 142: While most operations only need the topology information in the Plex, we must sometimes have the 143: user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of 144: polytope can be ambiguous. Also, Plex allows different symmetries of prism cell with the same 145: constituent points. Normally these types are autoamtically inferred and the user does not specify 146: them. 148: .seealso: `DMPlexComputeCellTypes()` 149: E*/ 150: typedef enum {DM_POLYTOPE_POINT, DM_POLYTOPE_SEGMENT, DM_POLYTOPE_POINT_PRISM_TENSOR, DM_POLYTOPE_TRIANGLE, DM_POLYTOPE_QUADRILATERAL, DM_POLYTOPE_SEG_PRISM_TENSOR, DM_POLYTOPE_TETRAHEDRON, DM_POLYTOPE_HEXAHEDRON, DM_POLYTOPE_TRI_PRISM, DM_POLYTOPE_TRI_PRISM_TENSOR, DM_POLYTOPE_QUAD_PRISM_TENSOR, DM_POLYTOPE_PYRAMID, DM_POLYTOPE_FV_GHOST, DM_POLYTOPE_INTERIOR_GHOST, DM_POLYTOPE_UNKNOWN, DM_NUM_POLYTOPES} DMPolytopeType; 151: PETSC_EXTERN const char *const DMPolytopeTypes[]; 153: /*E 154: PetscUnit - The seven fundamental SI units 156: Level: beginner 158: .seealso: `DMPlexGetScale()`, `DMPlexSetScale()` 159: E*/ 160: typedef enum {PETSC_UNIT_LENGTH, PETSC_UNIT_MASS, PETSC_UNIT_TIME, PETSC_UNIT_CURRENT, PETSC_UNIT_TEMPERATURE, PETSC_UNIT_AMOUNT, PETSC_UNIT_LUMINOSITY, NUM_PETSC_UNITS} PetscUnit; 162: /*S 163: DMField - PETSc object for defining a field on a mesh topology 165: Level: intermediate 166: S*/ 167: typedef struct _p_DMField* DMField; 169: /*S 170: DMUniversalLabel - A label that encodes a set of DMLabels, bijectively 172: Level: developer 173: S*/ 174: typedef struct _p_UniversalLabel* DMUniversalLabel; 176: typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList; 178: #endif