24 class TraversalObserver;
25 struct GridTraversalEvent;
219 bool splittingIsConsideredLocal,
220 bool joiningIsConsideredLocal
276 int axis = Dimensions-1
289 bool splittingIsConsideredLocal,
290 bool joiningIsConsideredLocal
952 bool traversalInverted
1020 const std::bitset<Dimensions>& periodicBC = 0
Translate grid traversal automaton's transitions into user events.
void mergeGridVertexRefinementStateAtHorizontalDomainBoundary(GridVertex &vertex, const GridVertex &inVertex, int neighbour)
Called by receiveAndMergeGridVertexAtHorizontalBoundary().
void receiveAndMergeGridVertexAtHorizontalBoundary(GridVertex &vertex)
Manage the data exchange after a vertex is loaded for the first time.
bool maySplit() const
Is the tree in principle allowed to split.
void traverse(TraversalObserver &observer, bool calledFromSpacetreeSet=false)
static void updateVertexRanksWithinCell(GridVertex fineGridVertices[TwoPowerD], int newId)
If a cell gets a new id, we have to update its vertices.
void removeDuplicateEntriesFromAdjancyListInEvent(GridTraversalEvent &event) const
Some of the entries in the event are modelled as array (for example the set of neighbours of a vertex...
void split(int treeId, const SplitInstruction &instruction)
Add a split instruction.
static constexpr int NoJoin
std::string toString() const
std::set< int > _hasSplit
I need this post-mortem list to identify which tree structures have to be copied/replicated where.
peano4::maps::HierarchicalStackMap< peano4::stacks::GridVertexStack > GridVertexStackMap
bool isVertexAdjacentToLocalSpacetree(GridVertex vertex, bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
Returns if a vertex is local to adjacent tree.
void descend(const AutomatonState &state, GridVertex vertices[TwoPowerD], TraversalObserver &observer)
void updateSplittingCounter(int treeId)
Reduce splitting counter.
Spacetree(const tarch::la::Vector< Dimensions, double > &offset, const tarch::la::Vector< Dimensions, double > &width, const std::bitset< Dimensions > &periodicBC=0)
bool isCellSplitCandidate(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD]) const
Can a cell be split (deployed to another rank)
void splitOrJoinCellBottomUp(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Realise the splits and joins.
static bool restrictToCoarseGrid(const tarch::la::Vector< Dimensions, int > &coarseVertexPosition, const tarch::la::Vector< Dimensions, int > &fineVertexPosition)
Determines whether to restrict a vertex to the coarser level or not.
std::set< int > _joining
If master: Set of workers that should join.
bool doesRankIndexIdentifyHorizontalDataExchange(int rank, bool calledByReceivingProcess) const
You may exchange data horizontally with rank if and only if.
void splitCellTopDown(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Split cell in a top down fashion.
bool isFaceAlongPeriodicBoundaryCondition(GridVertex vertex[TwoPowerD], int faceNumber, bool calledByReceivingProcess) const
void receiveAndMergeGridVertexAtVerticalBoundary(GridVertex &vertex)
This is a merge routine for vertical data exchange.
GridStatistics _statistics
static GridVertexStackMap _vertexStack
static constexpr int RankOfPeriodicBoundaryCondition
Periodic boundary conditions are technically realised as domain decomposition, i.e.
void updateVertexBeforeStore(GridVertex &vertex, GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &fineVertexPositionWithinPatch)
void mergeCellFromWorkerWithMasterThroughoutJoin(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Merge data from worker with master data throughout join.
std::set< int > getNeighbourTrees(const GridVertex &vertex, bool calledByReceivingProcess) const
Get the ids of the surrounding cells of a vertex.
void sendGridVertex(const GridVertex &vertex)
This one is to be invoked if and only if a vertex goes to the in/out stacks.
std::set< int > _childrenIds
int getNeighbourTrees(GridVertex vertex[TwoPowerD], int faceNumber, bool calledByReceivingProcess) const
Get the ids of the surround ids of a face.
void storeVertices(const AutomatonState &fineGridState, GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &cellPositionWithin3x3Patch, TraversalObserver &observer)
static tarch::la::Vector< Dimensions, int > convertToIntegerVector(const std::bitset< Dimensions > &in)
Little helper.
bool mayJoinWithWorker() const
We allow at most one join at a time and not while we split.
static void refineState(const AutomatonState &coarseGrid, AutomatonState fineGrid[ThreePowerD], tarch::la::Vector< Dimensions, int > fineGridPosition=tarch::la::Vector< Dimensions, int >(0), int axis=Dimensions-1)
Takes a state (describing a node in the tree) and returns the states on the next finer level along t...
const std::bitset< Dimensions > _periodicBC
Indicate per axis whether we have periodic boundary conditions.
void markVerticesAroundForkedCell(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD]) const
setIsAntecessorOfRefinedVertexInCurrentTreeSweep()
void loadVertices(const AutomatonState &fineGridState, GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &cellPositionWithin3x3Patch, TraversalObserver &observer)
Load the vertices of one cell.
bool areAllVerticesNonHanging(GridVertex vertices[TwoPowerD]) const
Could also be called areAllVerticesPersistent() in the Peano terminology.
SpacetreeState _spacetreeState
static constexpr int NumberOfStationarySweepsToWaitAtLeastTillJoin
static void incrementNumberOfAdjacentRefinedLocalCells(GridVertex vertices[TwoPowerD])
Every local refined cell should call this routine.
bool areAllVerticesUnrefined(GridVertex vertices[TwoPowerD]) const
AutomatonState _root
The root of a spacetree corresponds to the initial state of the tree traversal automaton.
std::set< int > _splitting
std::vector< peano4::grid::GridControlEvent > _gridControlEvents
We get these control events when we kick off the traversal and then realise/interpret them.
int _masterId
This is not a static master.
void receiveAndMergeUserData(const AutomatonState &state, TraversalObserver &observer, const GridTraversalEvent &enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD])
Spacetree(int newId, int masterId, const tarch::la::Vector< Dimensions, double > &offset, const tarch::la::Vector< Dimensions, double > &width, bool traversalInverted)
Only used by SpacetreeSet to create children of the original tree.
GridTraversalEventGenerator _gridTraversalEventGenerator
bool areAllVerticesRefined(GridVertex vertices[TwoPowerD]) const
bool shouldEraseAdjacencyInformation(const GridVertex &vertex, GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > fineVertexPositionWithinPatch) const
void mergeGridVertexAdjacencyListsAtHorizontalDomainBoundary(GridVertex &vertex, const GridVertex &inVertex, int neighbour)
void joinWithWorker(int id)
std::vector< int > _splittedCells
int getSplittingTree() const
bool isSpacetreeNodeLocal(GridVertex vertices[TwoPowerD], bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
Wrapper around GridTraversalEventGenerator::isSpacetreeNodeLocal()
std::set< int > _joinTriggered
This should be -1 if no join is triggered.
SplitSpecification _splitTriggered
A split is identified by a tuple of id and cell count which tells the code how many cells should go t...
bool mayJoinWithMaster() const
Only ranks that have no kids are allowed to join.
void evaluateGridControlEvents(const AutomatonState &fineGridState, GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Should only be called for inner cells.
bool isInvolvedInJoinOrFork() const
void updateVertexAfterLoad(GridVertex &vertex, GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &fineVertexPositionWithinPatch, TraversalObserver &observer)
This operation has multiple purposes.
static tarch::logging::Log _log
void joinWithMaster()
Join with master.
void sendUserData(const AutomatonState &state, TraversalObserver &observer, const GridTraversalEvent &enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD])
Send user data.
tarch::la::Vector< TwoPowerD, int > getAdjacentRanksForNewVertex(GridVertex coarseGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &vertexPositionWithin3x3Patch) const
GridStatistics getGridStatistics() const
The spacetree set has to be a singleton, as it is reponsible to accept requests for new trees from re...
The parallel namespace is Peano's core abstracts from both MPI and multicore parallelisation.
std::map< int, SplitInstruction > SplitSpecification