15 #include "../config/config.hpp"
16 #include "../general/hash.hpp"
17 #include "../general/globals.hpp"
18 #include "../general/sort_pairs.hpp"
19 #include "../linalg/densemat.hpp"
22 #include "../fem/geom.hpp"
68 Table &coarse_to_fine,
70 Table &ref_type_to_matrix,
108 explicit NCMesh(
const Mesh *mesh, std::istream *vertex_parents = NULL);
174 :
MeshId(index, element, local, geom)
187 :
MeshId(index, element, local, geom)
294 bool oriented =
true)
const;
305 int vert_index[4],
int edge_index[4],
306 int edge_orientation[4])
const;
563 int n4,
int n5,
int n6,
int n7,
int attr,
564 int fattr0,
int fattr1,
int fattr2,
565 int fattr3,
int fattr4,
int fattr5);
567 int NewWedge(
int n0,
int n1,
int n2,
568 int n3,
int n4,
int n5,
int attr,
569 int fattr0,
int fattr1,
570 int fattr2,
int fattr3,
int fattr4);
573 int fattr0,
int fattr1,
int fattr2,
int fattr3);
576 int eattr0,
int eattr1,
int eattr2,
int eattr3);
579 int attr,
int eattr0,
int eattr1,
int eattr2);
586 bool TriFaceSplit(
int v1,
int v2,
int v3,
int mid[3] = NULL)
const;
597 int mid12,
int mid34,
int level = 0);
600 int en1,
int en2,
int en3,
int en4,
int midf);
636 int elem,
const PointMatrix &pm,
637 PointMatrix &reordered)
const;
640 const PointMatrix& pm,
int level, Face* eface[4],
643 const PointMatrix& pm,
int level,
647 void TraverseEdge(
int vn0,
int vn1,
double t0,
double t1,
int flags,
730 for (
int i = 0; i <
dim; i++)
740 for (
int i = 0; i <
dim; i++)
844 int& h_level,
int& v_level)
const;
NCList face_list
lazy-initialized list of faces, see GetFaceList
void CollectLeafElements(int elem, int state)
NCList edge_list
lazy-initialized list of edges, see GetEdgeList
NCMesh(const Mesh *mesh, std::istream *vertex_parents=NULL)
int Size() const
Return the logical size of the array.
static void GridSfcOrdering3D(int width, int height, int depth, Array< int > &coords)
void CheckAnisoPrism(int vn1, int vn2, int vn3, int vn4, const Refinement *refs, int nref)
CoarseFineTransformations transforms
storage for data returned by Get[De]RefinementTransforms()
static void GridSfcOrdering2D(int width, int height, Array< int > &coords)
int NewQuadrilateral(int n0, int n1, int n2, int n3, int attr, int eattr0, int eattr1, int eattr2, int eattr3)
int elem[2]
up to 2 elements sharing the face
char ref_type
refinement XYZ bit mask (7 = full isotropic)
int GetFaceVerticesEdges(const MeshId &face_id, int vert_index[4], int edge_index[4], int edge_orientation[4]) const
Array< double > top_vertex_pos
coordinates of top-level vertices (organized as triples)
bool TriFaceSplit(int v1, int v2, int v3, int mid[3]=NULL) const
void SetDerefMatrixCodes(int parent, Array< int > &fine_coarse)
const CoarseFineTransformations & GetDerefinementTransforms()
char flag
generic flag/marker, can be used by algorithms
PointMatrix(const Point &p0, const Point &p1, const Point &p2)
Array< Triple< int, int, int > > reparents
scheduled node reparents (tmp)
Point(const Point &p0, const Point &p1)
void PrintVertexParents(std::ostream &out) const
I/O: Print the "vertex_parents" section of the mesh file (ver. >= 1.1).
void CollectTriFaceVertices(int v0, int v1, int v2, Array< int > &indices)
char tet_type
tetrahedron split type, currently always 0
virtual void LimitNCLevel(int max_nc_level)
virtual void Trim()
Save memory by releasing all non-essential and cached data.
int index
element number in the Mesh, -1 if refined
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3)
void CopyElements(int elem, const BlockArray< Element > &tmp_elements, Array< int > &index_map)
void ForceRefinement(int vn1, int vn2, int vn3, int vn4)
virtual int GetNumGhostElements() 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)
Lists all edges/faces in the nonconforming mesh.
unsigned matrix
index into NCList::point_matrices[geom]
void GetMeshComponents(Mesh &mesh) const
Fill Mesh::{vertices,elements,boundary} for the current finest level.
void ClearTransforms()
Free all internal data created by the above three functions.
Table derefinements
possible derefinements, see GetDerefinementTable
Data type dense matrix using column-major storage.
Geometry::Type Geom() const
NCList vertex_list
lazy-initialized list of vertices, see GetVertexList
void InitDerefTransforms()
static PointMatrix pm_prism_identity
char geom
Geometry::Type of the element (char for storage only)
BlockArray< Element >::iterator elem_iterator
void InitRootState(int root_count)
int GetEdgeNCOrientation(const MeshId &edge_id) const
int NewTetrahedron(int n0, int n1, int n2, int n3, int attr, int fattr0, int fattr1, int fattr2, int fattr3)
void CheckAnisoFace(int vn1, int vn2, int vn3, int vn4, int mid12, int mid34, int level=0)
virtual int GetNumGhostVertices() const
static PointMatrix pm_tri_identity
void CountSplits(int elem, int splits[3]) const
Geometry::Type Geom() const
void CollectDerefinements(int elem, Array< Connection > &list)
const Point & operator()(int i) const
Point & operator()(int i)
void GetLimitRefinements(Array< Refinement > &refinements, int max_level)
int PrintMemoryDetail() const
void TraverseEdge(int vn0, int vn1, double t0, double t1, int flags, int level, MatrixMap &matrix_map)
int spaceDim
dimensions of the elements and the vertex coordinates
Array< int > vertex_nodeId
int attribute
boundary element attribute, -1 if internal face
void DebugDump(std::ostream &out) const
void FindFaceNodes(int face, int node[4])
static const PointMatrix & GetGeomIdentity(Geometry::Type geom)
static int find_element_edge(const Element &el, int vn0, int vn1, bool abort=true)
int index
Mesh element number.
int master
master number (in Mesh numbering)
const NCList & GetFaceList()
Return the current list of conforming and nonconforming faces.
const MeshId & LookUp(int index, int *type=NULL) const
virtual void OnMeshUpdated(Mesh *mesh)
void DebugLeafOrder(std::ostream &out) const
A parallel extension of the NCMesh class.
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)
void CollectEdgeVertices(int v0, int v1, Array< int > &indices)
static int find_local_face(int geom, int a, int b, int c)
Array< Refinement > ref_stack
stack of scheduled refinements (temporary)
Point(const Point &p0, const Point &p1, const Point &p2, const Point &p3)
void CollectIncidentElements(int elem, const RefCoord coord[3], Array< int > &list) const
void ReferenceElement(int elem)
virtual bool IsGhost(const Element &el) const
void GetPointMatrix(Geometry::Type geom, const char *ref_path, DenseMatrix &matrix)
void CheckIsoFace(int vn1, int vn2, int vn3, int vn4, int en1, int en2, int en3, int en4, int midf)
Face * GetFace(Element &elem, int face_no)
void TraverseRefinements(int elem, int coarse_index, std::string &ref_path, RefPathMap &map)
int GetMidEdgeNode(int node1, int node2)
Element(Geometry::Type geom, int attr)
int PrintElements(std::ostream &out, int elem, int &coarse_id) const
Refinement(int index, int type=7)
int index
face number in the Mesh
const Table & GetDerefinementTable()
Table element_vertex
leaf-element to vertex table, see FindSetNeighbors
int Append(const T &el)
Append element 'el' to array, resize if necessary.
bool operator==(const PointMatrix &pm) const
void GetMatrix(DenseMatrix &point_matrix) const
int AddElement(const Element &el)
virtual void Derefine(const Array< int > &derefs)
void QuadFaceSplitLevel(int vn1, int vn2, int vn3, int vn4, int &h_level, int &v_level) const
void FindNeighbors(int elem, Array< int > &neighbors, const Array< int > *search_set=NULL)
Geometry::Type GetElementGeometry(int index) const
Return element geometry type. index is the Mesh element number.
Array< int > coarse_elements
state of leaf_elements before Refine(), set by MarkCoarseLevel()
virtual void UpdateVertices()
update Vertex::index and vertex_nodeId
int ReorderFacePointMat(int v0, int v1, int v2, int v3, int elem, const PointMatrix &pm, PointMatrix &reordered) const
Master(int index, int element, int local, int geom, int sb, int se)
Array< DenseMatrix * > point_matrices[Geometry::NumGeom]
List of unique point matrices for each slave geometry.
void RegisterFaces(int elem, int *fattr=NULL)
virtual void BuildEdgeList()
const CoarseFineTransformations & GetRefinementTransforms()
void LoadCoarseElements(std::istream &input)
I/O: Load the element refinement hierarchy from a mesh file.
Identifies a vertex/edge/face in both Mesh and NCMesh.
int FindMidEdgeNode(int node1, int node2) const
int parent
parent element, -1 if this is a root element, -2 if free
signed char local
local number within 'element'
virtual void ElementSharesFace(int elem, int local, int face)
int GetNumRootElements()
Return the number of root elements.
virtual void ElementSharesVertex(int elem, int local, int vnode)
int Size() const
Returns the number of TYPE I elements.
A class for non-conforming AMR on higher-order hexahedral, prismatic, quadrilateral or triangular mes...
int GetElementSizeReduction(int i) const
friend struct PointMatrixHash
virtual void GetBoundaryClosure(const Array< int > &bdr_attr_is_ess, Array< int > &bdr_vertices, Array< int > &bdr_edges)
int element
NCMesh::Element containing this vertex/edge/face.
Embedding(int elem, int matrix=0)
Geometry::Type GetFaceGeometry(int index) const
Return face geometry type. index is the Mesh face number.
static GeomInfo GI[Geometry::NumGeom]
HashTable< Node >::iterator node_iterator
int slaves_end
slave faces
NCMesh::RefCoord RefCoord
void ReparentNode(int node, int new_p1, int new_p2)
int NewTriangle(int n0, int n1, int n2, int attr, int eattr0, int eattr1, int eattr2)
void DeleteUnusedFaces(const Array< int > &elemFaces)
bool Iso
true if the mesh only contains isotropic refinements
Point(double x, double y, double z)
std::map< std::string, int > RefPathMap
int SpaceDimension() const
virtual void BuildFaceList()
Nonconforming edge/face within a bigger edge/face.
void DerefineElement(int elem)
void GetElementFacesAttributes(int i, Array< int > &faces, Array< int > &fattr) const
Return the faces and face attributes of leaf element 'i'.
void SetVertexPositions(const Array< mfem::Vertex > &vertices)
I/O: Set positions of all vertices (used by mesh loader).
HashTable< Node >::const_iterator node_const_iterator
const NCList & GetVertexList()
void RegisterElement(int e)
mfem::Element * NewMeshElement(int geom) const
PointMatrix(const Point &p0, const Point &p1, const Point &p2, const Point &p3, const Point &p4, const Point &p5)
void DeleteLast()
Delete the last entry of the array.
void UpdateLeafElements()
int TriFaceSplitLevel(int vn1, int vn2, int vn3) const
int RetrieveNode(const Element &el, int index)
Return el.node[index] correctly, even if the element is refined.
int Geoms
bit mask of element geometries present, see InitGeomFlags()
PointMatrix(const Point &p0, const Point &p1)
void BuildElementToVertexTable()
void ForgetElement(int e)
static PointMatrix pm_tet_identity
int GetMidFaceNode(int en1, int en2, int en3, int en4)
void RefineElement(int elem, char ref_type)
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)
void TraverseTetEdge(int vn0, int vn1, const Point &p0, const Point &p1, MatrixMap &matrix_map)
Array< int > boundary_faces
subset of all faces, set by BuildFaceList
int child[8]
2-8 children (if ref_type != 0)
const NCList & GetNCList(int entity)
Return vertex/edge/face list (entity = 0/1/2, respectively).
Array< int > leaf_elements
static PointMatrix pm_quad_identity
int EdgeSplitLevel(int vn1, int vn2) const
Array< MeshId > conforming
unsigned edge_flags
orientation flags, see OrientedPointMatrix
void Initialize(const mfem::Element *elem)
void FindVertexCousins(int elem, int local, Array< int > &cousins) const
signed char geom
Geometry::Type (faces only) (char to save RAM)
int QuadFaceSplitType(int v1, int v2, int v3, int v4, int mid[5]=NULL) const
void OrientedPointMatrix(const Slave &slave, DenseMatrix &oriented_matrix) const
Return the point matrix oriented according to the master and slave edges.
Array< int > free_element_ids
void TraverseQuadFace(int vn0, int vn1, int vn2, int vn3, const PointMatrix &pm, int level, Face *eface[4], MatrixMap &matrix_map)
int index(int i, int j, int nx, int ny)
int parent
Element index in the coarse mesh.
Point(double x, double y)
virtual void AssignLeafIndices()
static PointMatrix pm_hex_identity
void FindEdgeElements(int vn1, int vn2, int vn3, int vn4, Array< MeshId > &prisms) const
virtual void CheckDerefinementNCLevel(const Table &deref_table, Array< int > &level_ok, int max_nc_level)
T & Last()
Return the last element in the array.
void NeighborExpand(const Array< int > &elems, Array< int > &expanded, const Array< int > *search_set=NULL)
BlockArray< Element > elements
void FindSetNeighbors(const Array< char > &elem_set, Array< int > *neighbors, Array< char > *neighbor_set=NULL)
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'.
Slave(int index, int element, int local, int geom)
long MemoryUsage() const
Return total number of bytes allocated.
void PrintCoarseElements(std::ostream &out) const
I/O: Print the "coarse_elements" section of the mesh file (ver. >= 1.1).
HashTable< Node > shadow
temporary storage for reparented nodes
virtual void BuildVertexList()
const NCList & GetEdgeList()
Return the current list of conforming and nonconforming edges.
void UpdateElementToVertexTable()
virtual void ElementSharesEdge(int elem, int local, int enode)
MeshId(int index=-1, int element=-1, int local=-1, int geom=-1)
int GetElementDepth(int i) const
Return the distance of leaf 'i' from the root.
HashTable< Face >::iterator face_iterator
int FindNodeExt(const Element &el, int node, bool abort=true)
Extended version of find_node: works if 'el' is refined.
char ref_type
bit mask of X,Y,Z refinements (bits 0,1,2 respectively)
OutStream out(std::cout)
Global stream used by the library for standard output. Initially it uses the same std::streambuf as s...
void CollectQuadFaceVertices(int v0, int v1, int v2, int v3, Array< int > &indices)
static int find_node(const Element &el, int node)
void UnreferenceElement(int elem, Array< int > &elemFaces)
void LoadVertexParents(std::istream &input)
Rank 3 tensor (array of matrices)
Abstract data type element.
Point & operator=(const Point &src)
void PrintStats(std::ostream &out=mfem::out) const
int GetSingleElement() const
Return one of elem[0] or elem[1] and make sure the other is -1.
const double * CalcVertexPos(int node) const
int rank
processor number (ParNCMesh), -1 if undefined/unknown
int node[8]
element corners (if ref_type == 0)
int GetVertexRootCoord(int elem, RefCoord coord[3]) const
bool TraverseTriFace(int vn0, int vn1, int vn2, const PointMatrix &pm, int level, MatrixMap &matrix_map)
Defines the position of a fine element within a coarse element.
HashTable< Face >::const_iterator face_const_iterator
virtual void Refine(const Array< Refinement > &refinements)
int matrix
Index into the DenseTensor corresponding to the parent Geometry::Type stored in CoarseFineTransformat...
Array< char > face_geom
face geometry by face index, set by OnMeshUpdated
int GetEdgeMaster(int v1, int v2) const