50#define _IFT_Subdivision_Name "subdiv"
54#define SHARED_IRREGULAR_DATA_TAG 7654
55#define SUBDIVISION_SHARED_IRREGULAR_REC_TAG 7655
56#define SUBDIVISION_END_DATA 7656
57#define SUBDIVISION_MIGRATE_REMOTE_ELEMENTS_TAG 7657
58#define SHARED_EDGE_DATA_TAG 7658
59#define SUBDIVISION_SHARED_EDGE_REC_TAG 7659
62class ProcessCommunicator;
89#ifdef __MPI_PARALLEL_MODE
102 this->requiredDensity = rd;
105 this->globalNumber = 0;
106#ifdef __MPI_PARALLEL_MODE
129#ifdef __MPI_PARALLEL_MODE
130 void numberSharedEdges();
147 RS_IrregularNode(
int n, Subdivision :: RS_Mesh *
mesh,
int parent,
FloatArray & c,
double rd,
bool boundary) :
RS_Node(n,
mesh,
parent, c, rd,
boundary) { }
180#ifdef __MPI_PARALLEL_MODE
192 this->queue_flag =
false;
193 this->globalNumber = -1;
194#ifdef __MPI_PARALLEL_MODE
213 virtual double giveRequiredDensity();
218 void setNeighbor(
int iside,
int nb) { this->neghbours_base_elements.
at(iside) = nb; }
225 void buildTopLevelNodeConnectivity(Subdivision :: RS_Node *node);
243#ifdef __MPI_PARALLEL_MODE
264 bool isNeighborOf(Subdivision :: RS_Element *elem)
override;
271#ifdef __MPI_PARALLEL_MODE
274 shared_edges.resize(3);
291 bool isNeighborOf(Subdivision :: RS_Element *elem)
override;
298#ifdef __MPI_PARALLEL_MODE
301 shared_edges.resize(6);
307#ifdef __MPI_PARALLEL_MODE
333 int giveSharedPartitions(
IntArray &partitions);
340 std :: vector< std :: unique_ptr< Subdivision :: RS_Node > >
nodes;
341 std :: vector< std :: unique_ptr< Subdivision :: RS_Element > >
elements;
342#ifdef __MPI_PARALLEL_MODE
343 std :: vector< std :: unique_ptr< Subdivision :: RS_SharedEdge > >
edges;
347#ifdef __MPI_PARALLEL_MODE
355#ifdef __MPI_PARALLEL_MODE
357 this->subdivision = s;
362 this->subdivision = s;
373#ifdef __MPI_PARALLEL_MODE
376 void addEdge(Subdivision :: RS_SharedEdge *obj) {
edges.emplace_back(obj); }
378 void insertGlobalSharedNodeMap(Subdivision :: RS_Node *node);
379 int sharedNodeGlobal2Local(
int _globnum);
392 int operator() (
int i,
int j);
421 returnCode createMesh(
TimeStep *tStep,
int domainNumber,
int domainSerNum,
Domain **dNew)
override;
430 bool isNodeLocalIrregular(Subdivision :: RS_Node *node,
int myrank);
431 void assignGlobalNumbersToElements(
Domain *d);
433#ifdef __MPI_PARALLEL_MODE
438 bool exchangeSharedIrregulars();
441 void assignGlobalNumbersToSharedIrregulars();
444 void exchangeSharedEdges();
449 bool isNodeLocalSharedIrregular(Subdivision :: RS_Node *node,
int myrank);
452 int giveNumberOfProcesses();
MesherInterface(Domain *d)
Constructor.
RS_CompareNodePositions(RS_Mesh *_m)
void setQueueFlag(bool _qf)
const IntArray * giveNodes()
virtual void update_neighbours()
void setNumber(int newNum)
const IntArray * giveSharedEdges()
virtual int giveEdgeIndex(int iNode, int jNode)=0
int giveLeIndex()
Returns the longest edge index of the receiver.
void setSharedEdge(int iedge, int num)
virtual void drawGeometry()
virtual void numberSharedEdges(int iNode, IntArray &connNodes)=0
elementParallelMode giveParallelMode() const
IntArray neghbours_base_elements
int giveIrregular(int iedge)
elementParallelMode parallel_mode
int giveNeighbor(int iside)
void setGlobalNumber(int gn)
virtual void importConnectivity(ConnectivityTable *ct)=0
virtual double giveDensity()
void setNeighbor(int iside, int nb)
RS_Element(int number, Subdivision ::RS_Mesh *m, int parent, IntArray &nodes)
bool isTerminal()
Returns true if receiver is terminal (not further subdivided).
virtual int evaluateLongestEdge()
int giveSharedEdge(int iedge)
bool hasIrregulars()
Returns true if element has some irregular nodes.
virtual void makeSharedEdges()=0
const IntArray * giveChildren()
const IntArray * giveNeighbors()
void setIrregular(int iedge, int ir)
virtual void bisect(std ::queue< int > &subdivqueue, std ::list< int > &sharedIrregularsQueue)
virtual void generate(std ::list< int > &sharedEdgesQueue)
virtual void giveSideNodes(int iside, IntArray &snodes)=0
void setLeIndex(int _n)
Sets the longest edge index.
bool containsNode(int _node)
virtual bool isNeighborOf(Subdivision ::RS_Element *elem)=0
void setParallelMode(elementParallelMode _mode)
bool isIrregular() override
void giveEdgeNodes(int &i, int &j)
void setEdgeNodes(int i, int j)
RS_IrregularNode(int n, Subdivision ::RS_Mesh *mesh, int parent, FloatArray &c, double rd, bool boundary)
Subdivision::RS_SharedEdge * giveEdge(int i)
Subdivision::RS_Node * giveNode(int i)
void addElement(Subdivision ::RS_Element *obj)
int giveNumberOfElements()
bool sharedNodeMapInitialized
sharedNodeMap init flag
void addEdge(Subdivision ::RS_SharedEdge *obj)
Subdivision * giveSubdivision()
Subdivision * subdivision
std ::vector< std ::unique_ptr< Subdivision ::RS_SharedEdge > > edges
std ::map< int, Subdivision ::RS_Node * > sharedNodeMap
Global shared node map (index is global shared node number).
void initGlobalSharedNodeMap()
Subdivision::RS_Element * giveElement(int i)
std ::vector< std ::unique_ptr< Subdivision ::RS_Node > > nodes
std ::vector< std ::unique_ptr< Subdivision ::RS_Element > > elements
void addNode(Subdivision ::RS_Node *obj)
void insertConnectedElement(int num)
dofManagerParallelMode parallel_mode
void setConnectedElements(IntArray _conn)
void preallocateConnectedElements(int size)
void eraseConnectedElement(int num)
RS_Node(int n, Subdivision ::RS_Mesh *m, int parent, const FloatArray &c, double rd, bool boundary)
double giveCoordinate(int i)
void setParallelMode(dofManagerParallelMode _mode)
void setPartitions(IntArray _p)
dofManagerParallelMode giveParallelMode() const
virtual bool isIrregular()
void setGlobalNumber(int gn)
FloatArray * giveCoordinates()
const IntArray * giveConnectedElements()
const IntArray * givePartitions()
IntArray connectedElements
double giveRequiredDensity()
void giveEdgeNodes(int &i, int &j)
RS_SharedEdge(Subdivision ::RS_Mesh *m)
void setPartitions(IntArray _p)
const IntArray * givePartitions()
void addPartition(int _p, int allocChunk)
void setEdgeNodes(int i, int j)
void importConnectivity(ConnectivityTable *ct) override
void giveSideNodes(int iside, IntArray &snodes) override
void drawGeometry() override
int giveEdgeIndex(int iNode, int jNode) override
double giveDensity() override
void makeSharedEdges() override
RS_Tetra(int number, Subdivision ::RS_Mesh *mesh, int parent, IntArray &nodes)
void numberSharedEdges(int iNode, IntArray &connNodes) override
void bisect(std ::queue< int > &subdivqueue, std ::list< int > &sharedIrregularsQueue) override
bool isNeighborOf(Subdivision ::RS_Element *elem) override
void generate(std ::list< int > &sharedEdgesQueue) override
void update_neighbours() override
int evaluateLongestEdge() override
RS_Triangle(int number, Subdivision ::RS_Mesh *mesh, int parent, IntArray &nodes)
void generate(std ::list< int > &sharedEdgesQueue) override
void giveSideNodes(int iside, IntArray &snodes) override
double giveDensity() override
int evaluateLongestEdge() override
void numberSharedEdges(int iNode, IntArray &connNodes) override
void importConnectivity(ConnectivityTable *ct) override
void makeSharedEdges() override
bool isNeighborOf(Subdivision ::RS_Element *elem) override
void update_neighbours() override
void drawGeometry() override
int giveEdgeIndex(int iNode, int jNode) override
void bisect(std ::queue< int > &subdivqueue, std ::list< int > &sharedIrregularsQueue) override
Subdivision::RS_Mesh * giveMesh()
std ::queue< int > subdivqueue
std ::list< int > sharedEdgesQueue
Subdivision(Domain *d)
Constructor.
const char * giveClassName()
std ::list< int > sharedIrregularsQueue
@ Element_local
Element is local, there are no contributions from other domains to this element.
dofManagerParallelMode
In parallel mode, this type indicates the mode of DofManager.