27#include <unordered_map>
43 enum :
char {
X = 1,
Y = 2,
Z = 4,
XY = 3,
XZ = 5,
YZ = 6,
XYZ = 7 };
56 void Set(
int element,
char type,
102 bool want_ghosts =
false)
const;
113void Swap(CoarseFineTransformations &
a, CoarseFineTransformations &
b);
133 const std::array<int, 2> &pv);
137 const std::array<int, 4> &pv);
147 std::array<int, 2> &pv)
const;
151 std::array<int, 4> &pv)
const;
154 void Print(std::ostream &os)
const;
203 NCMesh(std::istream &input,
int version,
int &curved,
int &is_nc);
358 void BuildIndex()
const;
364 mutable std::unordered_map<int, std::pair<MeshIdType, int>> inv_index;
409 std::map<std::pair<int, int>,
410 std::array<int, 2>> &parentToKV);
455 bool oriented =
true)
const;
466 int vert_index[4],
int edge_index[4],
467 int edge_orientation[4])
const;
530 void Print(std::ostream &
out,
const std::string &comments =
"",
531 bool nurbs=
false)
const;
609 scale(0.5), scaleSet(false) {}
625#ifdef MFEM_USE_DOUBLE
626 static constexpr real_t scaleTol = 1.0e-8;
628 static constexpr real_t scaleTol = 1.0e-5;
759 MFEM_DEPRECATED
void FindFaceNodes(
int face,
int node[4])
const;
898 int n4,
int n5,
int n6,
int n7,
int attr,
899 int fattr0,
int fattr1,
int fattr2,
900 int fattr3,
int fattr4,
int fattr5);
902 int NewWedge(
int n0,
int n1,
int n2,
903 int n3,
int n4,
int n5,
int attr,
904 int fattr0,
int fattr1,
905 int fattr2,
int fattr3,
int fattr4);
908 int fattr0,
int fattr1,
int fattr2,
int fattr3);
910 int NewPyramid(
int n0,
int n1,
int n2,
int n3,
int n4,
int attr,
911 int fattr0,
int fattr1,
int fattr2,
int fattr3,
915 int eattr0,
int eattr1,
int eattr2,
int eattr3);
918 int attr,
int eattr0,
int eattr1,
int eattr2);
920 int NewSegment(
int n0,
int n1,
int attr,
int vattr1,
int vattr2);
938 int mid[5] = NULL )
const;
957 bool TriFaceSplit(
int n1,
int n2,
int n3,
int mid[3] = NULL)
const;
979 || (
nodes.FindId(mid[0], mid[1]) < 0 &&
980 nodes.FindId(mid[0], mid[2]) < 0 &&
981 nodes.FindId(mid[1], mid[2]) < 0));
1009 int mid12,
int mid34,
int level = 0);
1012 int en1,
int en2,
int en3,
int en4,
int midf);
1053 int elem,
const PointMatrix &pm,
1054 PointMatrix &reordered)
const;
1057 const PointMatrix& pm,
int level, Face* eface[4],
1058 MatrixMap &matrix_map);
1066 MatrixMap &matrix_map);
1068 MatrixMap &matrix_map);
1070 int level, MatrixMap &matrix_map);
1153 for (
int i = 0; i <
dim; i++)
1163 for (
int i = 0; i <
dim; i++)
1256 std::string &ref_path,
RefPathMap &map)
const;
1286 {
return reverse ? 1.0 - s : s; }
1324 int& h_level,
int& v_level)
const;
1353 "Element type " << geom <<
" is not supported by NCMesh.");
1422 friend struct MatrixMap;
1423 friend struct PointMatrixHash;
Dynamic 2D array using row-major layout.
int Size() const
Return the logical size of the array.
void DeleteAll()
Delete the whole array.
int Append(const T &el)
Append element 'el' to array, resize if necessary.
void DeleteLast()
Delete the last entry of the array.
T & Last()
Return the last element in the array.
Data type dense matrix using column-major storage.
Rank 3 tensor (array of matrices)
Abstract data type element.
A class for non-conforming AMR. The class is not used directly by the user, rather it is an extension...
int GetEdgeMaster(int v1, int v2) const
static constexpr int MaxElemEdges
Number of edges an element can have.
static PointMatrix pm_tet_identity
void OnMeshUpdated(Mesh *mesh)
int GetNumFaces() const
The number of faces.
int GetNodeVertex(int node)
Given a node index, return the vertex index associated.
void GetElementFacesAttributes(int i, Array< int > &faces, Array< int > &fattr) const
Return the faces and face attributes of leaf element i.
static GeomInfo GI[Geometry::NumGeom]
void FindNeighbors(int elem, Array< int > &neighbors, const Array< int > *search_set=NULL)
virtual void Trim()
Save memory by releasing all non-essential and cached data.
virtual void ElementSharesVertex(int elem, int local, int vnode)
HashTable< Node > shadow
temporary storage for reparented nodes
void SetDerefMatrixCodes(int parent, Array< int > &fine_coarse)
void CopyElements(int elem, const BlockArray< Element > &tmp_elements)
Array< Refinement > ref_stack
stack of scheduled refinements (temporary)
const Face & GetFace(int i) const
Access a Face.
const VertexToKnotSpan & GetVertexToKnotSpan() const
mfem::Element * NewMeshElement(int geom) const
void SetNodeScale(int p0, int p1, real_t scale)
Helper function to set scale for a node with parents p0, p1.
int NewTriangle(int n0, int n1, int n2, int attr, int eattr0, int eattr1, int eattr2)
void GetMeshComponents(Mesh &mesh) const
Fill Mesh::{vertices,elements,boundary} for the current finest level.
void LoadVertexToKnotSpan3D(std::istream &input)
void LoadCoarseElements(std::istream &input)
Load the element refinement hierarchy from a legacy mesh file.
void NeighborExpand(const Array< int > &elems, Array< int > &expanded, const Array< int > *search_set=NULL)
int PrintVertexParents(std::ostream *out) const
Print the "vertex_parents" section of the mesh file.
static PointMatrix pm_prism_identity
int NewSegment(int n0, int n1, int attr, int vattr1, int vattr2)
virtual bool IsParallel() const
Return true for ParNCMesh with more than one MPI process.
static int find_node(const Element &el, int node)
void DeleteUnusedFaces(const Array< int > &elemFaces)
const CoarseFineTransformations & GetRefinementTransforms() const
void BuildElementToVertexTable()
virtual int GetNGhostElements() const
void TraverseEdge(int vn0, int vn1, real_t t0, real_t t1, int flags, int level, MatrixMap &matrix_map)
static int find_element_edge(const Element &el, int vn0, int vn1, bool abort=true)
Array< int > free_element_ids
void LoadBoundary(std::istream &input)
Load the "boundary" section of the mesh file.
int Dimension() const
Return the dimension of the NCMesh.
virtual void ElementSharesFace(int elem, int local, int face)
int PrintMemoryDetail() const
Array< real_t > reparent_scale
scale associated with reparents (tmp)
static constexpr int MaxElemNodes
Number of nodes an element can have.
int NewHexahedron(int n0, int n1, int n2, int n3, int n4, int n5, int n6, int n7, int attr, int fattr0, int fattr1, int fattr2, int fattr3, int fattr4, int fattr5)
bool HaveTets() const
Return true if the mesh contains tetrahedral elements.
int AddElement(Geometry::Type geom, int attr)
void GetEdgeVertices(const MeshId &edge_id, int vert_index[2], bool oriented=true) const
Return Mesh vertex indices of an edge identified by 'edge_id'.
static PointMatrix pm_seg_identity
static constexpr int MaxFaceNodes
Number of faces an element can have.
const NCList & GetNCList(int entity)
Return vertex/edge/face list (entity = 0/1/2, respectively).
bool QuadFaceIsMaster(int n1, int n2, int n3, int n4) const
Determine if a Quad face is a master face.
Array< int > boundary_faces
subset of all faces, set by BuildFaceList
void Print(std::ostream &out, const std::string &comments="", bool nurbs=false) const
std::array< int, 4 > FindFaceNodes(int face) const
Method for finding the nodes associated to a face.
static PointMatrix pm_quad_identity
void ReferenceElement(int elem)
Add references to all nodes, edges and faces of the element.
void UpdateElementToVertexTable()
void LoadVertexToKnotSpan2D(std::istream &input)
BlockArray< Element > elements
Array< int > coarse_elements
state of leaf_elements before Refine(), set by MarkCoarseLevel()
const CoarseFineTransformations & GetDerefinementTransforms() const
Table derefinements
possible derefinements, see GetDerefinementTable
int FindNodeExt(const Element &el, int node, bool abort=true)
Extended version of find_node: works if 'el' is refined.
int ReorderFacePointMat(int v0, int v1, int v2, int v3, int elem, const PointMatrix &pm, PointMatrix &reordered) const
int FindMidEdgeNode(int node1, int node2) const
Array< char > face_geom
face geometry by face index, set by OnMeshUpdated
int GetEdgeNCOrientation(const MeshId &edge_id) const
Table element_vertex
leaf-element to vertex table, see FindSetNeighbors
Array< Triple< int, int, int > > reparents
scheduled node reparents (tmp)
virtual void BuildFaceList()
void CheckAnisoPrism(int vn1, int vn2, int vn3, int vn4, const Refinement *refs, int nref)
void LoadVertexParents(std::istream &input)
Load the vertex parent hierarchy from a mesh file.
static void GridSfcOrdering3D(int width, int height, int depth, Array< int > &coords)
Array< int > leaf_elements
finest elements, in Mesh ordering (+ ghosts)
const real_t * CalcVertexPos(int node) const
void CollectLeafElements(int elem, int state, Array< int > &ghosts, int &counter)
const Element & GetElement(int i) const
Access an Element.
int CountTopLevelNodes() const
Return the index of the last top-level node plus one.
void QuadFaceSplitLevel(int vn1, int vn2, int vn3, int vn4, int &h_level, int &v_level) const
Computes the number of horizontal and vertical splits of this quad that have occurred in the NCMesh....
int Geoms
bit mask of element geometries present, see InitGeomFlags()
void InitDerefTransforms()
int GetElementSizeReduction(int i) const
virtual void LimitNCLevel(int max_nc_level)
const NCList & GetVertexList()
bool ZeroRootStates() const
Return true if all root_states are zero.
Array< int > vertex_nodeId
vertex-index to node-id map, see UpdateVertices
int ParentFaceNodes(std::array< int, 4 > &nodes) const
Given a set of nodes defining a face, traverse the nodes structure to find the nodes that make up the...
int GetNumRootElements()
Return the number of root elements.
int RetrieveNode(const Element &el, int index)
Return el.node[index] correctly, even if the element is refined.
void FindEdgeElements(int vn1, int vn2, int vn3, int vn4, Array< MeshId > &prisms) const
void CollectDerefinements(int elem, Array< Connection > &list)
bool IsLegacyLoaded() const
I/O: Return true if the mesh was loaded from the legacy v1.1 format.
const Node & GetNode(int i) const
Access a Node.
virtual void ElementSharesEdge(int elem, int local, int enode)
VertexToKnotSpan vertex_to_knotspan
This is used for a NURBS mesh with this NCMesh as its patch topology.
int GetFaceVerticesEdges(const MeshId &face_id, int vert_index[4], int edge_index[4], int edge_orientation[4]) const
void RefineElement(int elem, char ref_type)
Refine the element elem with the refinement type ref_type.
void InitRootState(int root_count)
Geometry::Type GetElementGeometry(int index) const
Return element geometry type. index is the Mesh element number.
int NewQuadrilateral(int n0, int n1, int n2, int n3, int attr, int eattr0, int eattr1, int eattr2, int eattr3)
Array< int > leaf_sfc_index
natural tree ordering of leaf elements
void ForceRefinement(int vn1, int vn2, int vn3, int vn4)
void CollectEdgeVertices(int v0, int v1, Array< int > &indices)
void RefineVertexToKnotSpan(const std::vector< Array< int > > &kvf, const Array< KnotVector * > &kvext, std::map< std::pair< int, int >, std::array< int, 2 > > &parentToKV)
Remap knot-span indices vertex_to_knotspan after refinement.
NCList edge_list
lazy-initialized list of edges, see GetEdgeList
static PointMatrix pm_pyramid_identity
const NCList & GetFaceList()
Return the current list of conforming and nonconforming faces.
real_t GetScale(real_t s, bool reverse) const
Return directed scale in (0,1).
Geometry::Type GetFaceGeometry(int index) const
Return face geometry type. index is the Mesh face number.
void CollectTriFaceVertices(int v0, int v1, int v2, Array< int > &indices)
void InitRootElements()
Count root elements and initialize root_state.
int GetMidEdgeNode(int node1, int node2)
virtual void BuildEdgeList()
void DebugDump(std::ostream &out) const
void DebugLeafOrder(std::ostream &out) const
std::map< std::string, int > RefPathMap
int GetElementDepth(int i) const
Return the distance of leaf i from the root.
void LoadVertexToKnotSpan(std::istream &input)
void TraverseRefinements(int elem, int coarse_index, std::string &ref_path, RefPathMap &map) const
void CheckIsoFace(int vn1, int vn2, int vn3, int vn4, int en1, int en2, int en3, int en4, int midf)
void GetLimitRefinements(Array< Refinement > &refinements, int max_level)
int NewPyramid(int n0, int n1, int n2, int n3, int n4, int attr, int fattr0, int fattr1, int fattr2, int fattr3, int fattr4)
virtual void Derefine(const Array< int > &derefs)
bool Iso
true if the mesh only contains isotropic refinements
virtual void GetBoundaryClosure(const Array< int > &bdr_attr_is_ess, Array< int > &bdr_vertices, Array< int > &bdr_edges, Array< int > &bdr_faces)
Get a list of vertices (2D/3D), edges (3D) and faces (3D) that coincide with boundary elements with t...
bool TriFaceSplit(int n1, int n2, int n3, int mid[3]=NULL) const
Given a tri face defined by three vertices, establish whether the edges that make up this face have b...
bool Legacy
true if the mesh was loaded from the legacy v1.1 format
virtual void BuildVertexList()
static const PointMatrix & GetGeomIdentity(Geometry::Type geom)
int GetNVertices() const
Return the number of vertices in the NCMesh.
static constexpr int MaxElemFaces
Number of faces an element can have.
int GetNumElements() const
The number of elements.
void CheckAnisoFace(int vn1, int vn2, int vn3, int vn4, int mid12, int mid34, int level=0)
int NewWedge(int n0, int n1, int n2, int n3, int n4, int n5, int attr, int fattr0, int fattr1, int fattr2, int fattr3, int fattr4)
int GetVertexRootCoord(int elem, RefCoord coord[3]) const
static void CheckSupportedGeom(Geometry::Type geom)
Array< real_t > coordinates
void FindVertexCousins(int elem, int local, Array< int > &cousins) const
bool IsGhost(const Element &el) const
Return true if the Element el is a ghost element.
static constexpr int MaxElemChildren
Number of children an element can have.
const NCList & GetEdgeList()
Return the current list of conforming and nonconforming edges.
bool TriFaceIsMaster(int n1, int n2, int n3) const
Determine if a Triangle face is a master face.
int MyRank
used in parallel, or when loading a parallel file in serial
int AddElement(const Element &el)
Add an Element el to the NCMesh, optimized to reuse freed elements.
void CountSplits(int elem, int splits[3]) const
int spaceDim
dimensions of the elements and the vertex coordinates
void UnreferenceElement(int elem, Array< int > &elemFaces)
void LegacyToNewVertexOrdering(Array< int > &order) const
I/O: Return a map from old (v1.1) vertex indices to new vertex indices.
void CollectIncidentElements(int elem, const RefCoord coord[3], Array< int > &list) const
void TraverseTetEdge(int vn0, int vn1, const Point &p0, const Point &p1, MatrixMap &matrix_map)
int QuadFaceSplitType(int n1, int n2, int n3, int n4, real_t &s, int mid[5]=NULL) const
Given a quad face defined by four vertices, establish which edges of this face have been split,...
void RegisterFaces(int elem, int *fattr=NULL)
int PrintBoundary(std::ostream *out) const
CoarseFineTransformations transforms
storage for data returned by Get[De]RefinementTransforms()
int TriFaceSplitLevel(int vn1, int vn2, int vn3) const
Return the number of splits of this triangle that have occurred in the NCMesh. If zero,...
virtual void CheckDerefinementNCLevel(const Table &deref_table, Array< int > &level_ok, int max_nc_level)
void UpdateVertices()
This method assigns indices to vertices (Node::vert_index) that will be seen by the Mesh class and th...
int GetNFaces() const
Return the number of (2D) faces in the NCMesh.
NCList vertex_list
lazy-initialized list of vertices, see GetVertexList
bool HavePyramids() const
Return true if the mesh contains pyramid elements.
int NewTetrahedron(int n0, int n1, int n2, int n3, int attr, int fattr0, int fattr1, int fattr2, int fattr3)
void LoadCoordinates(std::istream &input)
Load the "coordinates" section of the mesh file.
void GetPointMatrix(Geometry::Type geom, const char *ref_path, DenseMatrix &matrix) const
void TraverseQuadFace(int vn0, int vn1, int vn2, int vn3, const PointMatrix &pm, int level, Face *eface[4], MatrixMap &matrix_map)
const Table & GetDerefinementTable()
void ClearTransforms()
Free all internal data created by the above three functions.
void SetAttribute(int i, int attr)
Set the attribute of leaf element i, which is a Mesh element index.
int SpaceDimension() const
Return the space dimension of the NCMesh.
void FindSetNeighbors(const Array< char > &elem_set, Array< int > *neighbors, Array< char > *neighbor_set=NULL)
int GetNumNodes() const
The number of Nodes.
NCMesh & operator=(NCMesh &)=delete
Copy assignment not supported.
void CollectQuadFaceVertices(int v0, int v1, int v2, int v3, Array< int > &indices)
void PrintCoordinates(std::ostream &out) const
Print the "coordinates" section of the mesh file.
TriFaceTraverseResults TraverseTriFace(int vn0, int vn1, int vn2, const PointMatrix &pm, int level, MatrixMap &matrix_map)
int GetMidFaceNode(int en1, int en2, int en3, int en4)
bool HavePrisms() const
Return true if the mesh contains prism elements.
long MemoryUsage() const
Return total number of bytes allocated.
void DerefineElement(int elem)
Derefine the element elem, does nothing on leaf elements.
NCList face_list
lazy-initialized list of faces, see GetFaceList
virtual void Refine(const Array< Refinement > &refinements)
void ReparentNode(int node, int new_p1, int new_p2, real_t scale)
static PointMatrix pm_tri_identity
static PointMatrix pm_hex_identity
void UpdateLeafElements()
Update the leaf elements indices in leaf_elements.
void LoadLegacyFormat(std::istream &input, int &curved, int &is_nc)
Load the deprecated MFEM mesh v1.1 format for backward compatibility.
int GetNEdges() const
Return the number of edges in the NCMesh.
int EdgeSplitLevel(int vn1, int vn2) const
Return the number of splits of this edge that have occurred in the NCMesh. If zero,...
static void GridSfcOrdering2D(int width, int height, Array< int > &coords)
static int find_local_face(int geom, int a, int b, int c)
Class representing a Nonconformal SubMesh. This is only used by SubMesh.
A parallel extension of the NCMesh class.
Class representing a Parallel Nonconformal SubMesh. This is only used by ParSubMesh.
Table stores the connectivity of elements of TYPE I to elements of TYPE II. For example,...
int Size() const
Returns the number of TYPE I elements.
For a NURBS mesh with nonconforming patch topology, this struct provides a map from hanging vertices ...
void GetVertex3D(int index, int &v, std::array< int, 2 > &ks, std::array< int, 4 > &pv) const
Get the data for a vertex in 3D.
void SetVertex2D(int index, int v, int ks, const std::array< int, 2 > &pv)
Set the data for a vertex in 2D.
void SetVertex3D(int index, int v, const std::array< int, 2 > &ks, const std::array< int, 4 > &pv)
Set the data for a vertex in 3D.
void SetSize(int dimension, int numVertices)
Set the spatial dimension and number of vertices.
void GetVertex2D(int index, int &v, int &ks, std::array< int, 2 > &pv) const
Get the data for a vertex in 2D.
void Print(std::ostream &os) const
Print all the data.
void SetKnotSpans3D(int index, const std::array< int, 2 > &ks)
Set the knot-span indices for a vertex in 3D.
std::pair< int, int > GetVertexParentPair(int index) const
Return the vertex pair representing the parent edge (2D) or face (3D).
int Size() const
Return the number of vertices.
void SetKnotSpan2D(int index, int ks)
Set the knot-span index for a vertex in 2D.
constexpr int dimension
This example only works in 3D. Kernels for 2D are not implemented.
int index(int i, int j, int nx, int ny)
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
void Swap(T &a, T &b)
Swap objects of type T. The operation is performed using the most specialized swap function from the ...
NCMesh::RefCoord RefCoord
Defines the position of a fine element within a coarse element.
unsigned ghost
For internal use: 0 if regular fine element, 1 if parallel ghost element.
Embedding(int elem, Geometry::Type geom, int matrix=0, bool ghost=false)
int parent
Coarse Element index in the coarse mesh.
int rank
processor number (ParNCMesh), -1 if undefined/unknown
int child[MaxElemChildren]
2-10 children (if ref_type != 0)
char tet_type
tetrahedron split type, currently always 0
Element(Geometry::Type geom, int attr)
char flag
generic flag/marker, can be used by algorithms
int node[MaxElemNodes]
element corners (if ref_type == 0)
char ref_type
bit mask of X,Y,Z refinements (bits 0,1,2 respectively)
char geom
Geometry::Type of the element (char for storage only)
int index
element number in the Mesh, -1 if refined
int parent
parent element, -1 if this is a root element, -2 if free'd
Geometry::Type Geom() const
void ForgetElement(int e)
int elem[2]
up to 2 elements sharing the face
void RegisterElement(int e)
int index
face number in the Mesh
int GetSingleElement() const
Return one of elem[0] or elem[1] and make sure the other is -1.
int attribute
boundary element attribute, -1 if internal face
This holds in one place the constants about the geometries we support.
int faces[MaxElemFaces][4]
int edges[MaxElemEdges][2]
void InitGeom(Geometry::Type geom)
GeomInfo(Geometry::Type geom)
Master(int index, int element, int local, int geom, int sb, int se)
int slaves_end
slave faces
Identifies a vertex/edge/face in both Mesh and NCMesh.
int element
NCMesh::Element containing this vertex/edge/face.
MeshId(int index, int element, int local, int geom=-1)
Geometry::Type Geom() const
signed char geom
Geometry::Type (faces only) (char to save RAM)
signed char local
local number within 'element'
const MeshIdType type
MeshIdType corresponding to the MeshId. UNRECOGNIZED if unfound.
Lists all edges/faces in the nonconforming mesh.
MeshIdType GetMeshIdType(int index) const
Return a face type for a given nc index.
Array< MeshId > conforming
All MeshIds corresponding to conformal faces.
Array< Slave > slaves
All MeshIds corresponding to slave faces.
bool CheckMeshIdType(int index, MeshIdType type) const
Given an index, check if this is a certain face type.
bool Empty() const
Whether the NCList is empty.
void Clear()
Erase the contents of the conforming, master and slave arrays.
void OrientedPointMatrix(const Slave &slave, DenseMatrix &oriented_matrix) const
Array< Master > masters
All MeshIds corresponding to master faces.
long TotalSize() const
The total size of the component arrays in the NCList.
Array< DenseMatrix * > point_matrices[Geometry::NumGeom]
List of unique point matrices for each slave geometry.
MeshIdAndType GetMeshIdAndType(int index) const
Return a mesh id and type for a given nc index.
void SetScale(real_t s, bool overwrite=false)
The PointMatrix stores the coordinates of the slave face using the master face coordinate as referenc...
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3, const Point &p4)
Point & operator()(int i)
void GetMatrix(DenseMatrix &point_matrix) const
PointMatrix(const Point &p0, const Point &p1, const Point &p2)
Point points[MaxElemNodes]
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3)
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3, const Point &p4, const Point &p5)
const Point & operator()(int i) const
bool operator==(const PointMatrix &pm) const
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3, const Point &p4, const Point &p5, const Point &p6, const Point &p7)
PointMatrix(const Point &p0, const Point &p1)
Point(const Point &p0, const Point &p1, real_t s=0.5)
Point(const Point &)=default
Point(real_t x, real_t y, real_t z)
Point(real_t x, real_t y)
Point & operator=(const Point &src)
Point(const Point &p0, const Point &p1, const Point &p2, const Point &p3)
Nonconforming edge/face within a bigger edge/face.
unsigned edge_flags
orientation flags, see OrientedPointMatrix
unsigned matrix
index into NCList::point_matrices[geom]
int master
master number (in Mesh numbering)
Slave(int index, int element, int local, int geom)
bool unsplit
Whether this face has no further splits.
bool ghost_neighbor
Whether the face neighbor is a ghost.
Refinement()=default
Refinement scale in each dimension.
void SetScaleForType(const real_t *scale)
Set the scale in the directions for the currently set type.
std::pair< char, real_t > ScaledType
int index
Mesh element number.
void Set(int element, char type, real_t scale=0.5)
Set the element, type, and scale.
char GetType() const
Return the type as char.
void SetType(char type, real_t scale=0.5)
Set the type and scale, assuming the element is already set.