71 const int *partitioning =
nullptr);
75 ParNCMesh(MPI_Comm comm, std::istream &input,
76 int version,
int &curved,
int &is_nc);
93 std::set<int> &conflicts);
100 Array<int> &level_ok,
int max_nc_level)
override;
160 MFEM_ASSERT(entity >= 0 && entity < 3,
"");
161 MFEM_ASSERT(
index >= 0,
"");
174 MFEM_ASSERT(entity >= 0 && entity < 3,
"");
175 MFEM_ASSERT(
index >= 0,
"");
186 MFEM_ASSERT(
id >= 0,
"");
198 MFEM_ASSERT(entity == 2,
"");
243 template<
typename Type>
245 const Table &deref_table);
255 void Trim()
override;
258 std::size_t
MemoryUsage(
bool with_base =
true)
const;
379 int local[2] = NULL );
402 void Dump(std::ostream &os)
const;
404 void Load(std::istream &is);
419 int GetInt(
int pos)
const;
471 template<
class ValueType,
bool RefTypes,
int Tag>
482 void Add(
int elem, ValueType val)
493 void Encode(
int)
override;
494 void Decode(
int)
override;
501 VarMessageTag::NEIGHBOR_REFINEMENT_VM>
505 typedef std::map<int, NeighborRefinementMessage>
Map;
511 VarMessageTag::NEIGHBOR_DEREFINEMENT_VM>
515 typedef std::map<int, NeighborDerefinementMessage>
Map;
522 VarMessageTag::NEIGHBOR_ELEMENT_RANK_VM>
526 typedef std::map<int, NeighborElementRankMessage>
Map;
534 VarMessageTag::REBALANCE_VM>
538 typedef std::map<int, RebalanceMessage>
Map;
554 typedef std::map<int, RebalanceDofMessage>
Map;
559 void Encode(
int)
override;
560 void Decode(
int)
override;
566 VarMessageTag::NEIGHBOR_PREFINEMENT_VM>
570 typedef std::map<int, NeighborPRefinementMessage>
Map;
607 const std::map<int, int> &elemToRef,
608 std::set<int> &conflicts);
615 int en1,
int en2,
int en3,
int en4,
617 const std::map<int, int> &elemToRef,
618 std::set<int> &conflicts);
622 const std::map<int, int> &elemToRef,
623 std::set<int> &conflicts);
629 const std::map<int, int> &elemToRef,
630 std::set<int> &conflicts);
637 friend class NeighborRowMessage;
638 friend class NeighborOrderMessage;
645 return a.index <
b.index;
651 return a.index ==
b.index;
int Size() const
Return the logical size of the array.
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
A class for non-conforming AMR. The class is not used directly by the user, rather it is an extension...
int PrintMemoryDetail() const
BlockArray< Element > elements
Array< int > leaf_elements
finest elements, in Mesh ordering (+ ghosts)
const NCList & GetVertexList()
const NCList & GetFaceList()
Return the current list of conforming and nonconforming faces.
const NCList & GetEdgeList()
Return the current list of conforming and nonconforming edges.
int MyRank
used in parallel, or when loading a parallel file in serial
long MemoryUsage() const
Return total number of bytes allocated.
Class for parallel meshes.
void DecodeTree(int elem, int &pos, Array< int > &elements) const
Array< unsigned char > data
encoded refinement (sub-)trees
const NCMesh * GetNCMesh() const
void Encode(const Array< int > &elements)
ElementSet(NCMesh *ncmesh=NULL, bool include_ref_types=false)
int GetInt(int pos) const
void Decode(Array< int > &elements) const
void FlagElements(const Array< int > &elements, char flag)
std::string RefPath() const
void EncodeTree(int elem)
void Load(std::istream &is)
void Dump(std::ostream &os) const
void SetNCMesh(NCMesh *ncmesh_)
void Encode(int) override
std::vector< ValueType > values
void Decode(int) override
std::vector< int > elements
void Add(int elem, ValueType val)
void SetNCMesh(ParNCMesh *pncmesh_)
Set pointer to ParNCMesh (needed to encode the message).
std::map< int, NeighborDerefinementMessage > Map
void AddDerefinement(int elem, int rank)
void AddElementRank(int elem, int rank)
std::map< int, NeighborElementRankMessage > Map
void AddRefinement(int elem, int order)
std::map< int, NeighborPRefinementMessage > Map
void AddRefinement(int elem, char ref_type)
std::map< int, NeighborRefinementMessage > Map
void Encode(int) override
std::vector< int > elem_ids
void SetElements(const Array< int > &elems, NCMesh *ncmesh)
void Decode(int) override
std::size_t MemoryUsage() const
void SetNCMesh(NCMesh *ncmesh)
std::map< int, RebalanceDofMessage > Map
std::map< int, RebalanceMessage > Map
void AddElementRank(int elem, int rank)
A parallel extension of the NCMesh class.
bool AnisotropicConflict(const Array< Refinement > &refinements, std::set< int > &conflicts)
Array< int > entity_elem_local[3]
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.
void MakeSharedTable(int ngroups, int ent, Array< int > &shared_local, Table &group_shared, Array< char > *entity_geom=NULL, char geom=0)
Array< int > tmp_neighbors
bool IsGhost(int entity, int index) const
Return true if the specified vertex/edge/face is a ghost.
int GetFaceOrientation(int index) const
Return (shared) face orientation relative to its owner element.
Array< Connection > entity_index_rank[3]
std::map< CommGroup, GroupId > GroupMap
GroupId GetEntityGroupId(int entity, int index)
int GetNGhostEdges() const
RebalanceDofMessage::Map send_rebalance_dofs
void CalcFaceOrientations()
const Array< int > & GetDerefineOldRanks() const
void DecodeGroups(std::istream &is, Array< GroupId > &ids)
bool PruneTree(int elem)
Internal. Recursive part of Prune().
bool CheckElementType(int elem, int type)
void CheckRefinement(int elem, char ref_type, const Array< Refinement > &refinements, const std::map< int, int > &elemToRef, std::set< int > &conflicts)
bool IsParallel() const override
Return true if using more than one MPI process.
const CommGroup & GetGroup(GroupId id) const
Return a list of ranks contained in the group of the given ID.
void GetGhostElements(Array< int > &gelem)
void Trim() override
Save memory by releasing all non-essential and cached data.
void BuildVertexList() override
void FindEdgesOfGhostElement(int elem, Array< int > &edges)
void FindFacesOfGhostElement(int elem, Array< int > &faces)
Array< int > ghost_layer
list of elements whose 'element_type' == 2.
void BuildFaceList() override
void GetFaceNeighbors(class ParMesh &pmesh)
int GetNGhostFaces() const
void LimitNCLevel(int max_nc_level) override
Parallel version of NCMesh::LimitNCLevel.
RebalanceDofMessage::Map recv_rebalance_dofs
void ChangeVertexMeshIdElement(NCMesh::MeshId &id, int elem)
void EncodeGroups(std::ostream &os, const Array< GroupId > &ids)
void Refine(const Array< Refinement > &refinements) override
int ElementRank(int index) const
void FindEdgesOfGhostFace(int face, Array< int > &edges)
Array< GroupId > entity_conf_group[3]
Array< int > boundary_layer
list of type 3 elements
int Partition(long index, long total_elements) const
Return the processor number for a global element number.
void AdjustMeshIds(Array< MeshId > ids[], int rank)
std::size_t GroupsMemoryUsage() const
const NCList & GetSharedVertices()
void ChangeEdgeMeshIdElement(NCMesh::MeshId &id, int elem)
void GetConformingSharedStructures(class ParMesh &pmesh)
bool CheckRefAnisoFaceSplits(int vn1, int vn2, int vn3, int vn4, int level=0)
void Derefine(const Array< int > &derefs) override
void Rebalance(const Array< int > *custom_partition=NULL)
int GetNGhostElements() const override
void ElementNeighborProcessors(int elem, Array< int > &ranks)
void RecvRebalanceDofs(Array< int > &elements, Array< long > &dofs)
Receive element DOFs sent by SendRebalanceDofs().
static int get_face_orientation(const Face &face, const Element &e1, const Element &e2, int local[2]=NULL)
void GetFineToCoarsePartitioning(const Array< int > &derefs, Array< int > &new_ranks) const
void ElementSharesFace(int elem, int local, int face) override
void BuildEdgeList() override
Array< char > tmp_shared_flag
Array< int > old_index_or_rank
void CheckRefIsoFace(int elem, int vn1, int vn2, int vn3, int vn4, int en1, int en2, int en3, int en4, const Array< Refinement > &refinements, const std::map< int, int > &elemToRef, std::set< int > &conflicts)
std::vector< int > CommGroup
void DecodeMeshIds(std::istream &is, Array< MeshId > ids[])
void GetBoundaryClosure(const Array< int > &bdr_attr_is_ess, Array< int > &bdr_vertices, Array< int > &bdr_edges, Array< int > &bdr_faces) override
void EncodeMeshIds(std::ostream &os, Array< MeshId > ids[])
void CheckRefinementMaster(const Array< Refinement > &refinements, const std::map< int, int > &elemToRef, std::set< int > &conflicts)
Check whether any master face is marked for a conflicting refinement.
Array< DenseMatrix * > aux_pm_store
Stores modified point matrices created by GetFaceNeighbors.
void CheckDerefinementNCLevel(const Table &deref_table, Array< int > &level_ok, int max_nc_level) override
void RedistributeElements(Array< int > &new_ranks, int target_elements, bool record_comm)
const NCList & GetSharedList(int entity)
Helper to get shared vertices/edges/faces ('entity' == 0/1/2 resp.).
int GetMyRank() const
Return the MPI rank for this process.
GroupId GetSingletonGroup(int rank)
void ChangeRemainingMeshIds(Array< MeshId > &ids, int pos, const Array< Pair< int, int > > &find)
Array< char > face_orient
GroupId GetEntityOwnerId(int entity, int index)
Return vertex/edge/face ('entity' == 0/1/2, resp.) owner.
Array< char > element_type
void InitOwners(int num, Array< GroupId > &entity_owner)
int GetNGhostVertices() const
void CheckRefAnisoFace(int elem, int vn1, int vn2, int vn3, int vn4, const Array< Refinement > &refinements, const std::map< int, int > &elemToRef, std::set< int > &conflicts)
Array< GroupId > entity_owner[3]
void CalculatePMatrixGroups()
void ElementSharesEdge(int elem, int local, int enode) override
const NCList & GetSharedEdges()
void GetDebugMesh(Mesh &debug_mesh) const
std::vector< CommGroup > GroupList
bool GroupContains(GroupId id, int rank) const
Return true if group 'id' contains the given rank.
const NCList & GetSharedFaces()
const Array< int > & GetRebalanceOldIndex() const
Array< GroupId > entity_pmat_group[3]
void MakeSharedList(const NCList &list, NCList &shared)
void AddConnections(int entity, int index, const Array< int > &ranks)
int InitialPartition(int index) const
Helper to get the partitioning when the serial mesh gets split initially.
void NeighborProcessors(Array< int > &neighbors)
void CreateGroups(int nentities, Array< Connection > &index_rank, Array< GroupId > &entity_group)
void SynchronizeDerefinementData(Array< Type > &elem_data, const Table &deref_table)
GroupId GetGroupId(const CommGroup &group)
void CommunicateGhostData(const Array< VarOrderElemInfo > &sendData, Array< VarOrderElemInfo > &recvData)
long PartitionFirstIndex(int rank, long total_elements) const
Return the global index of the first element owned by processor 'rank'.
void ElementSharesVertex(int elem, int local, int vnode) override
Subdomain representation of a topological parent in another ParMesh.
Table stores the connectivity of elements of TYPE I to elements of TYPE II. For example,...
int index(int i, int j, int nx, int ny)
bool operator==(const Array< T > &LHS, const Array< T > &RHS)
bool operator<(const Pair< A, B > &p, const Pair< A, B > &q)
Comparison operator for class Pair, based on the first element only.
Identifies a vertex/edge/face in both Mesh and NCMesh.
Lists all edges/faces in the nonconforming mesh.
Variable-length MPI message containing unspecific binary data.