MFEM  v3.4
Finite element discretization library
Classes | Public Types | Public Member Functions | Protected Types | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Friends | List of all members
mfem::ParNCMesh Class Reference

A parallel extension of the NCMesh class. More...

#include <pncmesh.hpp>

Inheritance diagram for mfem::ParNCMesh:
[legend]
Collaboration diagram for mfem::ParNCMesh:
[legend]

Classes

class  ElementSet
 
class  ElementValueMessage
 
class  NeighborDerefinementMessage
 
class  NeighborElementRankMessage
 
class  NeighborRefinementMessage
 
class  RebalanceDofMessage
 
class  RebalanceMessage
 

Public Types

typedef short GroupId
 
typedef std::vector< int > CommGroup
 

Public Member Functions

 ParNCMesh (MPI_Comm comm, const NCMesh &ncmesh)
 
virtual ~ParNCMesh ()
 
virtual void Refine (const Array< Refinement > &refinements)
 
virtual void LimitNCLevel (int max_nc_level)
 Parallel version of NCMesh::LimitNCLevel. More...
 
virtual void CheckDerefinementNCLevel (const Table &deref_table, Array< int > &level_ok, int max_nc_level)
 
virtual void Derefine (const Array< int > &derefs)
 
void Rebalance ()
 
int GetNElements () const
 
int GetNGhostVertices () const
 
int GetNGhostEdges () const
 
int GetNGhostFaces () const
 
int GetNGhostElements () const
 
const NCList & GetSharedVertices ()
 
const NCList & GetSharedEdges ()
 
const NCList & GetSharedFaces ()
 
const NCList & GetSharedList (int entity)
 Helper to get shared vertices/edges/faces ('entity' == 0/1/2 resp.). More...
 
int GetFaceOrientation (int index) const
 Return (shared) face orientation relative to its owner element. More...
 
GroupId GetOwnerId (int entity, int index) const
 Return vertex/edge/face ('entity' == 0/1/2, resp.) owner. More...
 
GroupId GetGroupId (int entity, int index) const
 Return the communication group ID for a vertex/edge/face. More...
 
const CommGroupGetGroup (GroupId id) const
 Return a list of ranks contained in the group of the given ID. More...
 
bool GroupContains (GroupId id, int rank) const
 Return true if group 'id' contains the given rank. More...
 
void AugmentMasterGroups ()
 
bool IsGhost (int entity, int index) const
 Return true if the specified vertex/edge/face is a ghost. More...
 
int ElementRank (int index) const
 
void GetFaceNeighbors (class ParMesh &pmesh)
 
int GetMyRank () const
 
void SendRebalanceDofs (int old_ndofs, const Table &old_element_dofs, long old_global_offset, FiniteElementSpace *space)
 Use the communication pattern from last Rebalance() to send element DOFs. More...
 
void RecvRebalanceDofs (Array< int > &elements, Array< long > &dofs)
 Receive element DOFs sent by SendRebalanceDofs(). More...
 
const Array< int > & GetRebalanceOldIndex () const
 
const Array< int > & GetDerefineOldRanks () const
 
template<typename Type >
void SynchronizeDerefinementData (Array< Type > &elem_data, const Table &deref_table)
 
virtual void GetBoundaryClosure (const Array< int > &bdr_attr_is_ess, Array< int > &bdr_vertices, Array< int > &bdr_edges)
 
virtual void Trim ()
 Save memory by releasing all non-essential and cached data. More...
 
long MemoryUsage (bool with_base=true) const
 Return total number of bytes allocated. More...
 
int PrintMemoryDetail (bool with_base=true) const
 
void GetDebugMesh (Mesh &debug_mesh) const
 
- Public Member Functions inherited from mfem::NCMesh
 NCMesh (const Mesh *mesh, std::istream *vertex_parents=NULL)
 
 NCMesh (const NCMesh &other)
 
virtual ~NCMesh ()
 
int Dimension () const
 
int SpaceDimension () const
 
int GetNVertices () const
 
int GetNEdges () const
 
int GetNFaces () const
 
const TableGetDerefinementTable ()
 
const NCListGetFaceList ()
 Return the current list of conforming and nonconforming faces. More...
 
const NCListGetEdgeList ()
 Return the current list of conforming and nonconforming edges. More...
 
const NCListGetVertexList ()
 
const NCListGetNCList (int entity)
 Return vertex/edge/face list (entity = 0/1/2, respectively). More...
 
void MarkCoarseLevel ()
 
const CoarseFineTransformationsGetRefinementTransforms ()
 
const CoarseFineTransformationsGetDerefinementTransforms ()
 
void ClearTransforms ()
 Free all internal data created by the above three functions. More...
 
void GetEdgeVertices (const MeshId &edge_id, int vert_index[2]) const
 Return Mesh vertex indices of an edge identified by 'edge_id'. More...
 
int GetEdgeNCOrientation (const MeshId &edge_id) const
 
void GetFaceVerticesEdges (const MeshId &face_id, int vert_index[4], int edge_index[4], int edge_orientation[4]) const
 Return Mesh vertex and edge indices of a face identified by 'face_id'. More...
 
int GetEdgeMaster (int v1, int v2) const
 
int GetElementGeometry () const
 Return the type of elements in the mesh. More...
 
int GetFaceGeometry () const
 
int GetElementDepth (int i) const
 Return the distance of leaf 'i' from the root. More...
 
void PrintVertexParents (std::ostream &out) const
 I/O: Print the "vertex_parents" section of the mesh file (ver. >= 1.1). More...
 
void PrintCoarseElements (std::ostream &out) const
 I/O: Print the "coarse_elements" section of the mesh file (ver. >= 1.1). More...
 
void LoadVertexParents (std::istream &input)
 
void LoadCoarseElements (std::istream &input)
 I/O: Load the element refinement hierarchy from a mesh file. More...
 
void SetVertexPositions (const Array< mfem::Vertex > &vertices)
 I/O: Set positions of all vertices (used by mesh loader). More...
 
long MemoryUsage () const
 Return total number of bytes allocated. More...
 
int PrintMemoryDetail () const
 
void PrintStats (std::ostream &out=mfem::out) const
 
void DebugDump (std::ostream &out) const
 

Protected Types

typedef std::vector< CommGroupGroupList
 
typedef std::map< CommGroup, GroupIdGroupMap
 
- Protected Types inherited from mfem::NCMesh
typedef HashTable< Node >::iterator node_iterator
 
typedef HashTable< Face >::iterator face_iterator
 
typedef HashTable< Node >::const_iterator node_const_iterator
 
typedef HashTable< Face >::const_iterator face_const_iterator
 
typedef BlockArray< Element >::iterator elem_iterator
 
typedef std::map< std::string, int > RefPathMap
 

Protected Member Functions

virtual void Update ()
 
virtual bool IsGhost (const Element &el) const
 
virtual int GetNumGhostElements () const
 
virtual int GetNumGhostVertices () const
 
int Partition (long index, long total_elements) const
 Return the processor number for a global element number. More...
 
int InitialPartition (int index) const
 Helper to get the partitioning when the serial mesh gets split initially. More...
 
long PartitionFirstIndex (int rank, long total_elements) const
 Return the global index of the first element owned by processor 'rank'. More...
 
virtual void UpdateVertices ()
 update Vertex::index and vertex_nodeId More...
 
virtual void AssignLeafIndices ()
 
virtual void OnMeshUpdated (Mesh *mesh)
 
GroupId GetGroupId (const CommGroup &group)
 
GroupId JoinGroups (GroupId g1, GroupId g2)
 
GroupId GetSingletonGroup (int rank)
 
virtual void BuildFaceList ()
 
virtual void BuildEdgeList ()
 
virtual void BuildVertexList ()
 
virtual void ElementSharesFace (int elem, int face)
 
virtual void ElementSharesEdge (int elem, int enode)
 
virtual void ElementSharesVertex (int elem, int vnode)
 
void InitOwners (int num, Array< GroupId > &entity_owner)
 
void InitGroups (int num, Array< GroupId > &entity_group)
 
void BuildSharedVertices ()
 
void CalcFaceOrientations ()
 
void UpdateLayers ()
 
void AddMasterSlaveConnections (int nitems, const NCList &list)
 
void AddMasterSlaveConnections (const NCList &list, int entity)
 
void GetGroupShared (Array< bool > &group_shared)
 
void MakeShared (const Array< GroupId > &entity_group, const NCList &list, NCList &shared)
 
void AdjustMeshIds (Array< MeshId > ids[], int rank)
 
void ChangeVertexMeshIdElement (NCMesh::MeshId &id, int elem)
 
void ChangeEdgeMeshIdElement (NCMesh::MeshId &id, int elem)
 
void ChangeRemainingMeshIds (Array< MeshId > &ids, int pos, const Array< Pair< int, int > > &find)
 
void EncodeMeshIds (std::ostream &os, Array< MeshId > ids[])
 
void DecodeMeshIds (std::istream &is, Array< MeshId > ids[])
 
void EncodeGroups (std::ostream &os, const Array< GroupId > &ids)
 
void DecodeGroups (std::istream &is, Array< GroupId > &ids)
 
bool CheckElementType (int elem, int type)
 
void ElementNeighborProcessors (int elem, Array< int > &ranks)
 
void NeighborProcessors (Array< int > &neighbors)
 
void Prune ()
 
bool PruneTree (int elem)
 Internal. Recursive part of Prune(). More...
 
void RedistributeElements (Array< int > &new_ranks, int target_elements, bool record_comm)
 
void ClearAuxPM ()
 
long GroupsMemoryUsage () const
 
- Protected Member Functions inherited from mfem::NCMesh
void GetMeshComponents (Array< mfem::Vertex > &mvertices, Array< mfem::Element *> &melements, Array< mfem::Element *> &mboundary) const
 Return the basic Mesh arrays for the current finest level. More...
 
void CollectLeafElements (int elem, int state)
 
void UpdateLeafElements ()
 
void RefineElement (int elem, char ref_type)
 
void DerefineElement (int elem)
 
int AddElement (const Element &el)
 
void FreeElement (int id)
 
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)
 
int NewQuadrilateral (int n0, int n1, int n2, int n3, int attr, int eattr0, int eattr1, int eattr2, int eattr3)
 
int NewTriangle (int n0, int n1, int n2, int attr, int eattr0, int eattr1, int eattr2)
 
mfem::ElementNewMeshElement (int geom) const
 
int GetMidEdgeNode (int vn1, int vn2)
 
int GetMidFaceNode (int en1, int en2, int en3, int en4)
 
int FaceSplitType (int v1, int v2, int v3, int v4, int mid[4]=NULL) const
 
void ForceRefinement (int vn1, int vn2, int vn3, int vn4)
 
void CheckAnisoFace (int vn1, int vn2, int vn3, int vn4, int mid12, int mid34, int level=0)
 
void CheckIsoFace (int vn1, int vn2, int vn3, int vn4, int en1, int en2, int en3, int en4, int midf)
 
void RefElement (int elem)
 
void UnrefElement (int elem, Array< int > &elemFaces)
 
FaceGetFace (Element &elem, int face_no)
 
void RegisterFaces (int elem, int *fattr=NULL)
 
void DeleteUnusedFaces (const Array< int > &elemFaces)
 
int FindAltParents (int node1, int node2)
 
bool NodeSetX1 (int node, int *n)
 
bool NodeSetX2 (int node, int *n)
 
bool NodeSetY1 (int node, int *n)
 
bool NodeSetY2 (int node, int *n)
 
bool NodeSetZ1 (int node, int *n)
 
bool NodeSetZ2 (int node, int *n)
 
void CollectDerefinements (int elem, Array< Connection > &list)
 
int ReorderFacePointMat (int v0, int v1, int v2, int v3, int elem, DenseMatrix &mat) const
 
void TraverseFace (int vn0, int vn1, int vn2, int vn3, const PointMatrix &pm, int level)
 
void TraverseEdge (int vn0, int vn1, double t0, double t1, int flags, int level)
 
void FindSetNeighbors (const Array< char > &elem_set, Array< int > *neighbors, Array< char > *neighbor_set=NULL)
 
void FindNeighbors (int elem, Array< int > &neighbors, const Array< int > *search_set=NULL)
 
void NeighborExpand (const Array< int > &elems, Array< int > &expanded, const Array< int > *search_set=NULL)
 
void CollectEdgeVertices (int v0, int v1, Array< int > &indices)
 
void CollectFaceVertices (int v0, int v1, int v2, int v3, Array< int > &indices)
 
void BuildElementToVertexTable ()
 
void UpdateElementToVertexTable ()
 
void GetPointMatrix (int geom, const char *ref_path, DenseMatrix &matrix)
 
void TraverseRefinements (int elem, int coarse_index, std::string &ref_path, RefPathMap &map)
 
void InitDerefTransforms ()
 
void SetDerefMatrixCodes (int parent, Array< int > &fine_coarse)
 
const double * CalcVertexPos (int node) const
 
int GetEdgeMaster (int node) const
 
void FindFaceNodes (int face, int node[4])
 
int EdgeSplitLevel (int vn1, int vn2) const
 
void FaceSplitLevel (int vn1, int vn2, int vn3, int vn4, int &h_level, int &v_level) const
 
void CountSplits (int elem, int splits[3]) const
 
void GetLimitRefinements (Array< Refinement > &refinements, int max_level)
 
int PrintElements (std::ostream &out, int elem, int &coarse_id) const
 
void CopyElements (int elem, const BlockArray< Element > &tmp_elements, Array< int > &index_map)
 

Static Protected Member Functions

static int get_face_orientation (Face &face, Element &e1, Element &e2, int local[2]=NULL)
 
static bool compare_ranks_indices (const Element *a, const Element *b)
 
- Static Protected Member Functions inherited from mfem::NCMesh
static int find_node (const Element &el, int node)
 
static int find_element_edge (const Element &el, int vn0, int vn1)
 
static int find_hex_face (int a, int b, int c)
 
static const PointMatrixGetGeomIdentity (int geom)
 

Protected Attributes

MPI_Comm MyComm
 
int NRanks
 
int MyRank
 
int NGhostVertices
 
int NGhostEdges
 
int NGhostFaces
 
int NElements
 
int NGhostElements
 
GroupList groups
 
GroupMap group_id
 
Array< GroupIdvertex_group
 
Array< GroupIdedge_group
 
Array< GroupIdface_group
 
Array< GroupIdvertex_owner
 
Array< GroupIdedge_owner
 
Array< GroupIdface_owner
 
NCList shared_vertices
 
NCList shared_edges
 
NCList shared_faces
 
Array< char > face_orient
 
bool groups_augmented
 
Array< char > element_type
 
Array< int > ghost_layer
 list of elements whose 'element_type' == 2. More...
 
Array< int > boundary_layer
 list of type 3 elements More...
 
Array< int > tmp_owner
 
Array< Connectionindex_rank
 
Array< int > tmp_neighbors
 
RebalanceDofMessage::Map send_rebalance_dofs
 
RebalanceDofMessage::Map recv_rebalance_dofs
 
Array< int > old_index_or_rank
 
Array< DenseMatrix * > aux_pm_store
 Stores modified point matrices created by GetFaceNeighbors. More...
 
- Protected Attributes inherited from mfem::NCMesh
int Dim
 
int spaceDim
 dimensions of the elements and the vertex coordinates More...
 
bool Iso
 true if the mesh only contains isotropic refinements More...
 
HashTable< Nodenodes
 
HashTable< Facefaces
 
BlockArray< Elementelements
 
Array< int > free_element_ids
 
int root_count
 
Array< double > top_vertex_pos
 
int NVertices
 
int NEdges
 
int NFaces
 
Array< int > leaf_elements
 
Array< int > vertex_nodeId
 
NCList face_list
 lazy-initialized list of faces, see GetFaceList More...
 
NCList edge_list
 lazy-initialized list of edges, see GetEdgeList More...
 
NCList vertex_list
 lazy-initialized list of vertices, see GetVertexList More...
 
Array< int > boundary_faces
 subset of all faces, set by BuildFaceList More...
 
Table element_vertex
 leaf-element to vertex table, see FindSetNeighbors More...
 
Array< Refinementref_stack
 stack of scheduled refinements (temporary) More...
 
Table derefinements
 possible derefinements, see GetDerefinementTable More...
 
CoarseFineTransformations transforms
 storage for data returned by Get[De]RefinementTransforms() More...
 
Array< int > coarse_elements
 state of leaf_elements before Refine(), set by MarkCoarseLevel() More...
 
TmpVertextmp_vertex
 

Friends

class ParMesh
 
class NeighborRowMessage
 

Additional Inherited Members

- Static Protected Attributes inherited from mfem::NCMesh
static PointMatrix pm_tri_identity
 
static PointMatrix pm_quad_identity
 
static PointMatrix pm_hex_identity
 
static GeomInfo GI [Geometry::NumGeom]
 
static GeomInfogi_hex = NCMesh::GI[Geometry::CUBE]
 
static GeomInfogi_quad = NCMesh::GI[Geometry::SQUARE]
 
static GeomInfogi_tri = NCMesh::GI[Geometry::TRIANGLE]
 

Detailed Description

A parallel extension of the NCMesh class.

The basic idea (and assumption) is that all processors share the coarsest layer ("root elements"). This has the advantage that refinements can easily be exchanged between processors when rebalancing since individual elements can be uniquely identified by the index of the root element and a path in the refinement tree.

Each leaf element is owned by one of the processors (NCMesh::Element::rank). The underlying NCMesh stores not only elements for the current ('MyRank') processor, but also a minimal layer of adjacent "ghost" elements owned by other processors. The ghost layer is synchronized after refinement.

The ghost layer contains all vertex-, edge- and face-neighbors of the current processor's region. It is used to determine constraining relations and ownership of DOFs on the processor boundary. Ghost elements are never seen by the rest of MFEM as they are skipped when a Mesh is created from the NCMesh.

The processor that owns a vertex, edge or a face (and in turn its DOFs) is currently defined to be the one with the lowest rank in the group of processors that share the entity.

Vertices, edges and faces that are not owned by this ('MyRank') processor are ghosts, and are numbered after all real vertices/edges/faces, i.e., they have indices greater than NVertices, NEdges, NFaces, respectively.

A shared vertex/edge/face is identified in an interprocessor message by a pair of numbers. The first number specifies an element in an ElementSet (typically sent at the beginning of the message) that contains the v/e/f. The second number is the local index of the v/e/f in that element.

Definition at line 61 of file pncmesh.hpp.

Member Typedef Documentation

◆ CommGroup

typedef std::vector<int> mfem::ParNCMesh::CommGroup

Definition at line 150 of file pncmesh.hpp.

◆ GroupId

typedef short mfem::ParNCMesh::GroupId

Definition at line 149 of file pncmesh.hpp.

◆ GroupList

typedef std::vector<CommGroup> mfem::ParNCMesh::GroupList
protected

Definition at line 264 of file pncmesh.hpp.

◆ GroupMap

typedef std::map<CommGroup, GroupId> mfem::ParNCMesh::GroupMap
protected

Definition at line 265 of file pncmesh.hpp.

Constructor & Destructor Documentation

◆ ParNCMesh()

mfem::ParNCMesh::ParNCMesh ( MPI_Comm  comm,
const NCMesh ncmesh 
)

Definition at line 28 of file pncmesh.cpp.

◆ ~ParNCMesh()

mfem::ParNCMesh::~ParNCMesh ( )
virtual

Definition at line 49 of file pncmesh.cpp.

Member Function Documentation

◆ AddMasterSlaveConnections() [1/2]

void mfem::ParNCMesh::AddMasterSlaveConnections ( int  nitems,
const NCList &  list 
)
protected

Definition at line 434 of file pncmesh.cpp.

◆ AddMasterSlaveConnections() [2/2]

void mfem::ParNCMesh::AddMasterSlaveConnections ( const NCList &  list,
int  entity 
)
protected

◆ AdjustMeshIds()

void mfem::ParNCMesh::AdjustMeshIds ( Array< MeshId ids[],
int  rank 
)
protected

Adjust some of the MeshIds before encoding for recipient 'rank', so that they only reference elements that exist in the recipient's ref. tree.

Definition at line 2013 of file pncmesh.cpp.

◆ AssignLeafIndices()

void mfem::ParNCMesh::AssignLeafIndices ( )
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 76 of file pncmesh.cpp.

◆ AugmentMasterGroups()

void mfem::ParNCMesh::AugmentMasterGroups ( )

Make sure comm groups of master edges and faces contain all ranks necessary to communicate master DOFs correctly.

Definition at line 513 of file pncmesh.cpp.

◆ BuildEdgeList()

void mfem::ParNCMesh::BuildEdgeList ( )
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 255 of file pncmesh.cpp.

◆ BuildFaceList()

void mfem::ParNCMesh::BuildFaceList ( )
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 215 of file pncmesh.cpp.

◆ BuildSharedVertices()

void mfem::ParNCMesh::BuildSharedVertices ( )
protected

◆ BuildVertexList()

void mfem::ParNCMesh::BuildVertexList ( )
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 291 of file pncmesh.cpp.

◆ CalcFaceOrientations()

void mfem::ParNCMesh::CalcFaceOrientations ( )
protected

Definition at line 643 of file pncmesh.cpp.

◆ ChangeEdgeMeshIdElement()

void mfem::ParNCMesh::ChangeEdgeMeshIdElement ( NCMesh::MeshId id,
int  elem 
)
protected

Definition at line 2114 of file pncmesh.cpp.

◆ ChangeRemainingMeshIds()

void mfem::ParNCMesh::ChangeRemainingMeshIds ( Array< MeshId > &  ids,
int  pos,
const Array< Pair< int, int > > &  find 
)
protected

Definition at line 2140 of file pncmesh.cpp.

◆ ChangeVertexMeshIdElement()

void mfem::ParNCMesh::ChangeVertexMeshIdElement ( NCMesh::MeshId id,
int  elem 
)
protected

Definition at line 2096 of file pncmesh.cpp.

◆ CheckDerefinementNCLevel()

void mfem::ParNCMesh::CheckDerefinementNCLevel ( const Table deref_table,
Array< int > &  level_ok,
int  max_nc_level 
)
virtual

Parallel version of NCMesh::CheckDerefinementNCLevel.

Reimplemented from mfem::NCMesh.

Definition at line 1484 of file pncmesh.cpp.

◆ CheckElementType()

bool mfem::ParNCMesh::CheckElementType ( int  elem,
int  type 
)
protected

Definition at line 732 of file pncmesh.cpp.

◆ ClearAuxPM()

void mfem::ParNCMesh::ClearAuxPM ( )
protected

Definition at line 1059 of file pncmesh.cpp.

◆ compare_ranks_indices()

bool mfem::ParNCMesh::compare_ranks_indices ( const Element a,
const Element b 
)
staticprotected

Definition at line 793 of file pncmesh.cpp.

◆ DecodeGroups()

void mfem::ParNCMesh::DecodeGroups ( std::istream &  is,
Array< GroupId > &  ids 
)
protected

Definition at line 2294 of file pncmesh.cpp.

◆ DecodeMeshIds()

void mfem::ParNCMesh::DecodeMeshIds ( std::istream &  is,
Array< MeshId ids[] 
)
protected

Definition at line 2195 of file pncmesh.cpp.

◆ Derefine()

void mfem::ParNCMesh::Derefine ( const Array< int > &  derefs)
virtual

Parallel reimplementation of NCMesh::Derefine, keeps ghost layers in sync. The interface is identical.

Reimplemented from mfem::NCMesh.

Definition at line 1232 of file pncmesh.cpp.

◆ ElementNeighborProcessors()

void mfem::ParNCMesh::ElementNeighborProcessors ( int  elem,
Array< int > &  ranks 
)
protected

Return a list of processors that own elements in the immediate neighborhood of 'elem' (i.e., vertex, edge and face neighbors), and are not 'MyRank'.

Definition at line 749 of file pncmesh.cpp.

◆ ElementRank()

int mfem::ParNCMesh::ElementRank ( int  index) const
inline

Returns owner processor for element 'index'. This is normally MyRank but for index >= NElements (i.e., for ghosts) it may be something else.

Definition at line 200 of file pncmesh.hpp.

◆ ElementSharesEdge()

void mfem::ParNCMesh::ElementSharesEdge ( int  elem,
int  enode 
)
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 240 of file pncmesh.cpp.

◆ ElementSharesFace()

void mfem::ParNCMesh::ElementSharesFace ( int  elem,
int  face 
)
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 202 of file pncmesh.cpp.

◆ ElementSharesVertex()

void mfem::ParNCMesh::ElementSharesVertex ( int  elem,
int  vnode 
)
protectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 278 of file pncmesh.cpp.

◆ EncodeGroups()

void mfem::ParNCMesh::EncodeGroups ( std::ostream &  os,
const Array< GroupId > &  ids 
)
protected

Definition at line 2252 of file pncmesh.cpp.

◆ EncodeMeshIds()

void mfem::ParNCMesh::EncodeMeshIds ( std::ostream &  os,
Array< MeshId ids[] 
)
protected

Definition at line 2152 of file pncmesh.cpp.

◆ get_face_orientation()

int mfem::ParNCMesh::get_face_orientation ( Face face,
Element e1,
Element e2,
int  local[2] = NULL 
)
staticprotected

Definition at line 617 of file pncmesh.cpp.

◆ GetBoundaryClosure()

void mfem::ParNCMesh::GetBoundaryClosure ( const Array< int > &  bdr_attr_is_ess,
Array< int > &  bdr_vertices,
Array< int > &  bdr_edges 
)
virtual

Extension of NCMesh::GetBoundaryClosure. Filters out ghost vertices and ghost edges from 'bdr_vertices' and 'bdr_edges'.

Reimplemented from mfem::NCMesh.

Definition at line 669 of file pncmesh.cpp.

◆ GetDebugMesh()

void mfem::ParNCMesh::GetDebugMesh ( Mesh debug_mesh) const

Extract a debugging Mesh containing all leaf elements, including ghosts. The debug mesh will have element attributes set to element rank + 1.

Definition at line 2458 of file pncmesh.cpp.

◆ GetDerefineOldRanks()

const Array<int>& mfem::ParNCMesh::GetDerefineOldRanks ( ) const
inline

Get previous (pre-Derefine) fine element ranks. This complements the CoarseFineTransformations::embeddings array in parallel.

Definition at line 230 of file pncmesh.hpp.

◆ GetFaceNeighbors()

void mfem::ParNCMesh::GetFaceNeighbors ( class ParMesh pmesh)

Populate face neighbor members of ParMesh from the ghost layer, without communication.

Definition at line 799 of file pncmesh.cpp.

◆ GetFaceOrientation()

int mfem::ParNCMesh::GetFaceOrientation ( int  index) const
inline

Return (shared) face orientation relative to its owner element.

Definition at line 144 of file pncmesh.hpp.

◆ GetGroup()

const CommGroup& mfem::ParNCMesh::GetGroup ( GroupId  id) const
inline

Return a list of ranks contained in the group of the given ID.

Definition at line 175 of file pncmesh.hpp.

◆ GetGroupId() [1/2]

GroupId mfem::ParNCMesh::GetGroupId ( int  entity,
int  index 
) const
inline

Return the communication group ID for a vertex/edge/face.

Definition at line 164 of file pncmesh.hpp.

◆ GetGroupId() [2/2]

ParNCMesh::GroupId mfem::ParNCMesh::GetGroupId ( const CommGroup group)
protected

Definition at line 336 of file pncmesh.cpp.

◆ GetGroupShared()

void mfem::ParNCMesh::GetGroupShared ( Array< bool > &  group_shared)
protected

Definition at line 562 of file pncmesh.cpp.

◆ GetMyRank()

int mfem::ParNCMesh::GetMyRank ( ) const
inline

Definition at line 215 of file pncmesh.hpp.

◆ GetNElements()

int mfem::ParNCMesh::GetNElements ( ) const
inline

Definition at line 91 of file pncmesh.hpp.

◆ GetNGhostEdges()

int mfem::ParNCMesh::GetNGhostEdges ( ) const
inline

Definition at line 94 of file pncmesh.hpp.

◆ GetNGhostElements()

int mfem::ParNCMesh::GetNGhostElements ( ) const
inline

Definition at line 96 of file pncmesh.hpp.

◆ GetNGhostFaces()

int mfem::ParNCMesh::GetNGhostFaces ( ) const
inline

Definition at line 95 of file pncmesh.hpp.

◆ GetNGhostVertices()

int mfem::ParNCMesh::GetNGhostVertices ( ) const
inline

Definition at line 93 of file pncmesh.hpp.

◆ GetNumGhostElements()

virtual int mfem::ParNCMesh::GetNumGhostElements ( ) const
inlineprotectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 299 of file pncmesh.hpp.

◆ GetNumGhostVertices()

virtual int mfem::ParNCMesh::GetNumGhostVertices ( ) const
inlineprotectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 300 of file pncmesh.hpp.

◆ GetOwnerId()

GroupId mfem::ParNCMesh::GetOwnerId ( int  entity,
int  index 
) const
inline

Return vertex/edge/face ('entity' == 0/1/2, resp.) owner.

Definition at line 153 of file pncmesh.hpp.

◆ GetRebalanceOldIndex()

const Array<int>& mfem::ParNCMesh::GetRebalanceOldIndex ( ) const
inline

Get previous indices (pre-Rebalance) of current elements. Index of -1 indicates that an element didn't exist in the mesh before.

Definition at line 226 of file pncmesh.hpp.

◆ GetSharedEdges()

const NCList& mfem::ParNCMesh::GetSharedEdges ( )
inline

Return a list of edges shared by this processor and at least one other processor. (NOTE: this is a subset of the NCMesh::edge_list; slaves are empty.)

Definition at line 112 of file pncmesh.hpp.

◆ GetSharedFaces()

const NCList& mfem::ParNCMesh::GetSharedFaces ( )
inline

Return a list of faces shared by this processor and another processor. (NOTE: this is a subset of NCMesh::face_list; slaves are empty.)

Definition at line 123 of file pncmesh.hpp.

◆ GetSharedList()

const NCList& mfem::ParNCMesh::GetSharedList ( int  entity)
inline

Helper to get shared vertices/edges/faces ('entity' == 0/1/2 resp.).

Definition at line 133 of file pncmesh.hpp.

◆ GetSharedVertices()

const NCList& mfem::ParNCMesh::GetSharedVertices ( )
inline

Return a list of vertices shared by this processor and at least one other processor. (NOTE: only NCList::conforming will be set.)

Definition at line 100 of file pncmesh.hpp.

◆ GetSingletonGroup()

ParNCMesh::GroupId mfem::ParNCMesh::GetSingletonGroup ( int  rank)
protected

Definition at line 369 of file pncmesh.cpp.

◆ GroupContains()

bool mfem::ParNCMesh::GroupContains ( GroupId  id,
int  rank 
) const

Return true if group 'id' contains the given rank.

Definition at line 378 of file pncmesh.cpp.

◆ GroupsMemoryUsage()

long mfem::ParNCMesh::GroupsMemoryUsage ( ) const
protected

Definition at line 2509 of file pncmesh.cpp.

◆ InitGroups()

void mfem::ParNCMesh::InitGroups ( int  num,
Array< GroupId > &  entity_group 
)
protected

Definition at line 398 of file pncmesh.cpp.

◆ InitialPartition()

int mfem::ParNCMesh::InitialPartition ( int  index) const
inlineprotected

Helper to get the partitioning when the serial mesh gets split initially.

Definition at line 307 of file pncmesh.hpp.

◆ InitOwners()

void mfem::ParNCMesh::InitOwners ( int  num,
Array< GroupId > &  entity_owner 
)
protected

Definition at line 389 of file pncmesh.cpp.

◆ IsGhost() [1/2]

bool mfem::ParNCMesh::IsGhost ( int  entity,
int  index 
) const
inline

Return true if the specified vertex/edge/face is a ghost.

Definition at line 188 of file pncmesh.hpp.

◆ IsGhost() [2/2]

virtual bool mfem::ParNCMesh::IsGhost ( const Element el) const
inlineprotectedvirtual

Reimplemented from mfem::NCMesh.

Definition at line 296 of file pncmesh.hpp.

◆ JoinGroups()

ParNCMesh::GroupId mfem::ParNCMesh::JoinGroups ( GroupId  g1,
GroupId  g2 
)
protected

Definition at line 352 of file pncmesh.cpp.

◆ LimitNCLevel()

void mfem::ParNCMesh::LimitNCLevel ( int  max_nc_level)
virtual

Parallel version of NCMesh::LimitNCLevel.

Reimplemented from mfem::NCMesh.

Definition at line 1214 of file pncmesh.cpp.

◆ MakeShared()

void mfem::ParNCMesh::MakeShared ( const Array< GroupId > &  entity_group,
const NCList &  list,
NCList &  shared 
)
protected

Definition at line 586 of file pncmesh.cpp.

◆ MemoryUsage()

long mfem::ParNCMesh::MemoryUsage ( bool  with_base = true) const

Return total number of bytes allocated.

Definition at line 2521 of file pncmesh.cpp.

◆ NeighborProcessors()

void mfem::ParNCMesh::NeighborProcessors ( Array< int > &  neighbors)
protected

Get a list of ranks that own elements in the neighborhood of our region. NOTE: MyRank is not included.

Definition at line 781 of file pncmesh.cpp.

◆ OnMeshUpdated()

void mfem::ParNCMesh::OnMeshUpdated ( Mesh mesh)
protectedvirtual

Get edge and face numbering from 'mesh' (i.e., set all Edge::index and Face::index) after a new mesh was created from us.

Reimplemented from mfem::NCMesh.

Definition at line 156 of file pncmesh.cpp.

◆ Partition()

int mfem::ParNCMesh::Partition ( long  index,
long  total_elements 
) const
inlineprotected

Return the processor number for a global element number.

Definition at line 303 of file pncmesh.hpp.

◆ PartitionFirstIndex()

long mfem::ParNCMesh::PartitionFirstIndex ( int  rank,
long  total_elements 
) const
inlineprotected

Return the global index of the first element owned by processor 'rank'.

Definition at line 311 of file pncmesh.hpp.

◆ PrintMemoryDetail()

int mfem::ParNCMesh::PrintMemoryDetail ( bool  with_base = true) const

Definition at line 2548 of file pncmesh.cpp.

◆ Prune()

void mfem::ParNCMesh::Prune ( )
protected

Traverse the (local) refinement tree and determine which subtrees are no longer needed, i.e., their leaves are not owned by us nor are they our ghosts. These subtrees are then derefined.

Definition at line 1108 of file pncmesh.cpp.

◆ PruneTree()

bool mfem::ParNCMesh::PruneTree ( int  elem)
protected

Internal. Recursive part of Prune().

Definition at line 1071 of file pncmesh.cpp.

◆ Rebalance()

void mfem::ParNCMesh::Rebalance ( )

Migrate leaf elements of the global refinement hierarchy (including ghost elements) so that each processor owns the same number of leaves (+-1).

Definition at line 1542 of file pncmesh.cpp.

◆ RecvRebalanceDofs()

void mfem::ParNCMesh::RecvRebalanceDofs ( Array< int > &  elements,
Array< long > &  dofs 
)

Receive element DOFs sent by SendRebalanceDofs().

Definition at line 1821 of file pncmesh.cpp.

◆ RedistributeElements()

void mfem::ParNCMesh::RedistributeElements ( Array< int > &  new_ranks,
int  target_elements,
bool  record_comm 
)
protected

Assign new Element::rank to leaf elements and send them to their new owners, keeping the ghost layer up to date. Used by Rebalance() and Derefine().

Definition at line 1600 of file pncmesh.cpp.

◆ Refine()

void mfem::ParNCMesh::Refine ( const Array< Refinement > &  refinements)
virtual

An override of NCMesh::Refine, which is called eventually, after making sure that refinements that occur on the processor boundary are sent to the neighbor processors so they can keep their ghost layers up to date.

Reimplemented from mfem::NCMesh.

Definition at line 1142 of file pncmesh.cpp.

◆ SendRebalanceDofs()

void mfem::ParNCMesh::SendRebalanceDofs ( int  old_ndofs,
const Table old_element_dofs,
long  old_global_offset,
FiniteElementSpace space 
)

Use the communication pattern from last Rebalance() to send element DOFs.

Definition at line 1788 of file pncmesh.cpp.

◆ SynchronizeDerefinementData()

template<typename Type >
template void mfem::ParNCMesh::SynchronizeDerefinementData< double > ( Array< Type > &  elem_data,
const Table deref_table 
)

Exchange element data for derefinements that straddle processor boundaries. 'elem_data' is enlarged and filled with ghost values.

Definition at line 1404 of file pncmesh.cpp.

◆ Trim()

void mfem::ParNCMesh::Trim ( )
virtual

Save memory by releasing all non-essential and cached data.

Reimplemented from mfem::NCMesh.

Definition at line 2475 of file pncmesh.cpp.

◆ Update()

void mfem::ParNCMesh::Update ( )
protectedvirtual

Apart from the primary data structure, which is the element/node/face hierarchy, there is secondary data that is derived from the primary data and needs to be updated when the primary data changes. Update() takes care of that and needs to be called after refinement and derefinement.

Reimplemented from mfem::NCMesh.

Definition at line 54 of file pncmesh.cpp.

◆ UpdateLayers()

void mfem::ParNCMesh::UpdateLayers ( )
protected

Definition at line 694 of file pncmesh.cpp.

◆ UpdateVertices()

void mfem::ParNCMesh::UpdateVertices ( )
protectedvirtual

update Vertex::index and vertex_nodeId

Reimplemented from mfem::NCMesh.

Definition at line 110 of file pncmesh.cpp.

Friends And Related Function Documentation

◆ NeighborRowMessage

friend class NeighborRowMessage
friend

Definition at line 541 of file pncmesh.hpp.

◆ ParMesh

friend class ParMesh
friend

Definition at line 540 of file pncmesh.hpp.

Member Data Documentation

◆ aux_pm_store

Array<DenseMatrix*> mfem::ParNCMesh::aux_pm_store
protected

Stores modified point matrices created by GetFaceNeighbors.

Definition at line 533 of file pncmesh.hpp.

◆ boundary_layer

Array<int> mfem::ParNCMesh::boundary_layer
protected

list of type 3 elements

Definition at line 292 of file pncmesh.hpp.

◆ edge_group

Array<GroupId> mfem::ParNCMesh::edge_group
protected

Definition at line 271 of file pncmesh.hpp.

◆ edge_owner

Array<GroupId> mfem::ParNCMesh::edge_owner
protected

Definition at line 272 of file pncmesh.hpp.

◆ element_type

Array<char> mfem::ParNCMesh::element_type
protected

Type of each leaf element: 1 - our element (rank == MyRank), 3 - our element, and neighbor to the ghost layer, 2 - ghost layer element (existing element, but rank != MyRank), 0 - element beyond the ghost layer, may not be a real element. Note: indexed by Element::index. See also UpdateLayers().

Definition at line 289 of file pncmesh.hpp.

◆ face_group

Array<GroupId> mfem::ParNCMesh::face_group
protected

Definition at line 271 of file pncmesh.hpp.

◆ face_orient

Array<char> mfem::ParNCMesh::face_orient
protected

Definition at line 279 of file pncmesh.hpp.

◆ face_owner

Array<GroupId> mfem::ParNCMesh::face_owner
protected

Definition at line 272 of file pncmesh.hpp.

◆ ghost_layer

Array<int> mfem::ParNCMesh::ghost_layer
protected

list of elements whose 'element_type' == 2.

Definition at line 291 of file pncmesh.hpp.

◆ group_id

GroupMap mfem::ParNCMesh::group_id
protected

Definition at line 268 of file pncmesh.hpp.

◆ groups

GroupList mfem::ParNCMesh::groups
protected

Definition at line 267 of file pncmesh.hpp.

◆ groups_augmented

bool mfem::ParNCMesh::groups_augmented
protected

Definition at line 281 of file pncmesh.hpp.

◆ index_rank

Array<Connection> mfem::ParNCMesh::index_rank
protected

Definition at line 342 of file pncmesh.hpp.

◆ MyComm

MPI_Comm mfem::ParNCMesh::MyComm
protected

Definition at line 258 of file pncmesh.hpp.

◆ MyRank

int mfem::ParNCMesh::MyRank
protected

Definition at line 259 of file pncmesh.hpp.

◆ NElements

int mfem::ParNCMesh::NElements
protected

Definition at line 262 of file pncmesh.hpp.

◆ NGhostEdges

int mfem::ParNCMesh::NGhostEdges
protected

Definition at line 261 of file pncmesh.hpp.

◆ NGhostElements

int mfem::ParNCMesh::NGhostElements
protected

Definition at line 262 of file pncmesh.hpp.

◆ NGhostFaces

int mfem::ParNCMesh::NGhostFaces
protected

Definition at line 261 of file pncmesh.hpp.

◆ NGhostVertices

int mfem::ParNCMesh::NGhostVertices
protected

Definition at line 261 of file pncmesh.hpp.

◆ NRanks

int mfem::ParNCMesh::NRanks
protected

Definition at line 259 of file pncmesh.hpp.

◆ old_index_or_rank

Array<int> mfem::ParNCMesh::old_index_or_rank
protected

After Rebalance, this array holds the old element indices, or -1 if an element didn't exist in the mesh previously. After Derefine, it holds the ranks of the old (potentially non-existent) fine elements.

Definition at line 530 of file pncmesh.hpp.

◆ recv_rebalance_dofs

RebalanceDofMessage::Map mfem::ParNCMesh::recv_rebalance_dofs
protected

Definition at line 525 of file pncmesh.hpp.

◆ send_rebalance_dofs

RebalanceDofMessage::Map mfem::ParNCMesh::send_rebalance_dofs
protected

Recorded communication pattern from last Rebalance. Used by Send/RecvRebalanceDofs to ship element DOFs.

Definition at line 524 of file pncmesh.hpp.

◆ shared_edges

NCList mfem::ParNCMesh::shared_edges
protected

Definition at line 276 of file pncmesh.hpp.

◆ shared_faces

NCList mfem::ParNCMesh::shared_faces
protected

Definition at line 277 of file pncmesh.hpp.

◆ shared_vertices

NCList mfem::ParNCMesh::shared_vertices
protected

Definition at line 275 of file pncmesh.hpp.

◆ tmp_neighbors

Array<int> mfem::ParNCMesh::tmp_neighbors
protected

Definition at line 404 of file pncmesh.hpp.

◆ tmp_owner

Array<int> mfem::ParNCMesh::tmp_owner
protected

Definition at line 341 of file pncmesh.hpp.

◆ vertex_group

Array<GroupId> mfem::ParNCMesh::vertex_group
protected

Definition at line 271 of file pncmesh.hpp.

◆ vertex_owner

Array<GroupId> mfem::ParNCMesh::vertex_owner
protected

Definition at line 272 of file pncmesh.hpp.


The documentation for this class was generated from the following files: