Actual source code: petscdmtypes.h

  1: #ifndef PETSCDMTYPES_H
  2: #define PETSCDMTYPES_H

  4: /* 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: .seealso: `DMType`, `DMGetType()`, `DMCompositeCreate()`, `DMDACreate()`, `DMSetType()`, `DMType`, `DMDA`, `DMPLEX`
 12: S*/
 13: typedef struct _p_DM *DM;

 15: /*E
 16:   DMBoundaryType - Describes the choice for fill of ghost cells on physical domain boundaries.

 18:   Level: beginner

 20:   A boundary may be of type `DM_BOUNDARY_NONE` (no ghost nodes), `DM_BOUNDARY_GHOSTED` (ghost vertices/cells
 21:   exist but aren't filled; you can put values into them and then apply a stencil that uses those ghost locations),
 22:   `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;
 23:   not yet implemented for 3d), `DM_BOUNDARY_PERIODIC` (ghost vertices/cells filled by the opposite
 24:   edge of the domain), or `DM_BOUNDARY_TWIST` (like periodic, only glued backwards like a Mobius strip).

 26:   Notes:
 27:   This is information for the boundary of the __PHYSICAL__ domain. It has nothing to do with boundaries between
 28:   processes. That width is always determined by the stencil width; see `DMDASetStencilWidth()`.

 30:   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 .

 32:   Developer Notes:
 33:     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
 34:   as the 0th grid point where the physical boundary serves as the mirror?

 36:   References:
 37: . * -  https://scicomp.stackexchange.com/questions/5355/writing-the-poisson-equation-finite-difference-matrix-with-neumann-boundary-cond

 39: .seealso: `DMDASetBoundaryType()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMDACreate()`
 40: E*/
 41: typedef enum {
 42:   DM_BOUNDARY_NONE,
 43:   DM_BOUNDARY_GHOSTED,
 44:   DM_BOUNDARY_MIRROR,
 45:   DM_BOUNDARY_PERIODIC,
 46:   DM_BOUNDARY_TWIST
 47: } DMBoundaryType;
 48: /*E
 49:   DMBoundaryConditionType - indicates what type of boundary condition is to be imposed

 51:   Note: This flag indicates the type of function which will define the condition:
 52: $ DM_BC_ESSENTIAL       - A Dirichlet condition using a function of the coordinates
 53: $ DM_BC_ESSENTIAL_FIELD - A Dirichlet condition using a function of the coordinates and auxiliary field data
 54: $ DM_BC_ESSENTIAL_BD_FIELD - A Dirichlet condition using a function of the coordinates, facet normal, and auxiliary field data
 55: $ DM_BC_NATURAL         - A Neumann condition using a function of the coordinates
 56: $ DM_BC_NATURAL_FIELD   - A Neumann condition using a function of the coordinates and auxiliary field data
 57: $ DM_BC_NATURAL_RIEMANN - A flux condition which determines the state in ghost cells
 58: The user can check whether a boundary condition is essential using (type & DM_BC_ESSENTIAL), and similarly for
 59: natural conditions (type & DM_BC_NATURAL)

 61:   Level: beginner

 63: .seealso: `DMAddBoundary()`, `DSAddBoundary()`, `DSGetBoundary()`
 64: E*/
 65: typedef enum {
 66:   DM_BC_ESSENTIAL          = 1,
 67:   DM_BC_ESSENTIAL_FIELD    = 5,
 68:   DM_BC_NATURAL            = 2,
 69:   DM_BC_NATURAL_FIELD      = 6,
 70:   DM_BC_ESSENTIAL_BD_FIELD = 9,
 71:   DM_BC_NATURAL_RIEMANN    = 10
 72: } DMBoundaryConditionType;

 74: /*E
 75:   DMPointLocationType - Describes the method to handle point location failure

 77:   Level: beginner

 79:   If a search using `DM_POINTLOCATION_NONE` fails, the failure is signaled with a negative cell number. On the
 80:   other hand, if `DM_POINTLOCATION_NEAREST` is used, on failure, the (approximate) nearest point in the mesh is
 81:   used, replacing the given point in the input vector. `DM_POINTLOCATION_REMOVE` returns values only for points
 82:   which were located.

 84: .seealso: `DMLocatePoints()`
 85: E*/
 86: typedef enum {
 87:   DM_POINTLOCATION_NONE,
 88:   DM_POINTLOCATION_NEAREST,
 89:   DM_POINTLOCATION_REMOVE
 90: } DMPointLocationType;

 92: /*E
 93:   DMAdaptationStrategy - Describes the strategy used for adaptive solves

 95:   Level: beginner

 97:   DM_ADAPTATION_INITIAL will refine a mesh based on an initial guess. DM_ADAPTATION_SEQUENTIAL will refine the
 98:   mesh based on a sequence of solves, much like grid sequencing. DM_ADAPTATION_MULTILEVEL will use the sequence
 99:   of constructed meshes in a multilevel solve, much like the Systematic Upscaling of Brandt.

101: .seealso: `DMAdaptorSolve()`
102: E*/
103: typedef enum {
104:   DM_ADAPTATION_INITIAL,
105:   DM_ADAPTATION_SEQUENTIAL,
106:   DM_ADAPTATION_MULTILEVEL
107: } DMAdaptationStrategy;

109: /*E
110:   DMAdaptationCriterion - Describes the test used to decide whether to coarsen or refine parts of the mesh

112:   Level: beginner

114:   `DM_ADAPTATION_REFINE` will uniformly refine a mesh, much like grid sequencing. `DM_ADAPTATION_LABEL` will adapt
115:   the mesh based upon a label of the cells filled with `DMAdaptFlag` markers. `DM_ADAPTATION_METRIC` will try to
116:   mesh the manifold described by the input metric tensor uniformly. PETSc can also construct such a metric based
117:   upon an input primal or a gradient field.

119: .seealso: `DMAdaptorSolve()`
120: E*/
121: typedef enum {
122:   DM_ADAPTATION_NONE,
123:   DM_ADAPTATION_REFINE,
124:   DM_ADAPTATION_LABEL,
125:   DM_ADAPTATION_METRIC
126: } DMAdaptationCriterion;

128: /*E
129:   DMAdaptFlag - Marker in the label prescribing adaptation

131:   Level: beginner

133: .seealso: `DMAdaptLabel()`
134: E*/
135: typedef enum {
136:   DM_ADAPT_DETERMINE = PETSC_DETERMINE,
137:   DM_ADAPT_KEEP      = 0,
138:   DM_ADAPT_REFINE,
139:   DM_ADAPT_COARSEN,
140:   DM_ADAPT_COARSEN_LAST,
141:   DM_ADAPT_RESERVED_COUNT
142: } DMAdaptFlag;

144: /*E
145:   DMDirection - Indicates a coordinate direction

147:   Level: beginner

149: .seealso: `DMDAGetRay()`, `DMDAGetProcessorSubset()`, `DMPlexShearGeometry()`
150: E*/
151: typedef enum {
152:   DM_X,
153:   DM_Y,
154:   DM_Z
155: } DMDirection;

157: /*E
158:   DMEnclosureType - The type of enclosure relation between one `DM` and another

160:   Level: beginner

162:   Notes:
163:   For example, one `DM` dmA may be the boundary of another dmB, in which case it would be labeled `DM_ENC_SUBMESH`.

165:   If the situation is reversed, and dmA has boundary dmB, it would be labeled `DM_ENC_SUPERMESH`.

167:   Likewise, if dmA was a subregion of dmB, it would be labeled `DM_ENC_SUBMESH`.

169:   If no relation can be determined, `DM_ENC_NONE` is used.

171:   If a relation is not yet known, then `DM_ENC_UNKNOWN` is used.

173: .seealso: `DMGetEnclosureRelation()`
174: E*/
175: typedef enum {
176:   DM_ENC_EQUALITY,
177:   DM_ENC_SUPERMESH,
178:   DM_ENC_SUBMESH,
179:   DM_ENC_NONE,
180:   DM_ENC_UNKNOWN
181: } DMEnclosureType;

183: /*E
184:   DMPolytopeType - This describes the polytope represented by each cell.

186:   Level: beginner

188:   While most operations only need the topology information in the `DMPLEX`, we must sometimes have the
189:   user specify a polytope. For instance, when interpolating from a cell-vertex mesh, the type of
190:   polytope can be ambiguous. Also, `DMPLEX` allows different symmetries of a prism cell with the same
191:   constituent points. Normally these types are autoamtically inferred and the user does not specify
192:   them.

194: .seealso: `DMPlexComputeCellTypes()`
195: E*/
196: typedef enum {
197:   DM_POLYTOPE_POINT,
198:   DM_POLYTOPE_SEGMENT,
199:   DM_POLYTOPE_POINT_PRISM_TENSOR,
200:   DM_POLYTOPE_TRIANGLE,
201:   DM_POLYTOPE_QUADRILATERAL,
202:   DM_POLYTOPE_SEG_PRISM_TENSOR,
203:   DM_POLYTOPE_TETRAHEDRON,
204:   DM_POLYTOPE_HEXAHEDRON,
205:   DM_POLYTOPE_TRI_PRISM,
206:   DM_POLYTOPE_TRI_PRISM_TENSOR,
207:   DM_POLYTOPE_QUAD_PRISM_TENSOR,
208:   DM_POLYTOPE_PYRAMID,
209:   DM_POLYTOPE_FV_GHOST,
210:   DM_POLYTOPE_INTERIOR_GHOST,
211:   DM_POLYTOPE_UNKNOWN,
212:   DM_NUM_POLYTOPES
213: } DMPolytopeType;
214: PETSC_EXTERN const char *const DMPolytopeTypes[];

216: /*E
217:   PetscUnit - The seven fundamental SI units

219:   Level: beginner

221: .seealso: `DMPlexGetScale()`, `DMPlexSetScale()`
222: E*/
223: typedef enum {
224:   PETSC_UNIT_LENGTH,
225:   PETSC_UNIT_MASS,
226:   PETSC_UNIT_TIME,
227:   PETSC_UNIT_CURRENT,
228:   PETSC_UNIT_TEMPERATURE,
229:   PETSC_UNIT_AMOUNT,
230:   PETSC_UNIT_LUMINOSITY,
231:   NUM_PETSC_UNITS
232: } PetscUnit;

234: /*S
235:     DMField - PETSc object for defining a field on a mesh topology

237:     Level: intermediate
238: S*/
239: typedef struct _p_DMField *DMField;

241: /*S
242:     DMUniversalLabel - A label that encodes a set of `DMLabel`s, bijectively

244:     Level: developer
245: S*/
246: typedef struct _p_UniversalLabel *DMUniversalLabel;

248: typedef struct _n_DMGeneratorFunctionList *DMGeneratorFunctionList;

250: #endif