Peano
Loading...
Searching...
No Matches
Spacetree.h
Go to the documentation of this file.
1// This file is part of the Peano project. For conditions of distribution and
2// use, please see the copyright notice at www.peano-framework.org
3#pragma once
4
5#include "AutomatonState.h"
6#include "GridVertex.h"
7#include "GridStatistics.h"
8#include "GridControlEvent.h"
10
11#include "tarch/logging/Log.h"
12
14
17
18#include <set>
19#include <bitset>
20
21namespace peano4 {
22 namespace grid {
23 class Spacetree;
24 class TraversalObserver;
25 struct GridTraversalEvent;
26
27 namespace tests {
28 class SpacetreeTest;
29 }
30 }
31
32 namespace parallel {
33 class SpacetreeSet;
34 }
35}
36
41 public:
54 static constexpr int RankOfPeriodicBoundaryCondition = -2;
56
57 private:
59
62
84 GridVertex coarseGridVertices[TwoPowerD],
85 GridVertex fineGridVertices[TwoPowerD]
86 ) const;
87
88 int _id;
89
91
98
100
110 std::set<int> _childrenIds;
111
115 const std::bitset<Dimensions> _periodicBC;
116
125
126 std::set<int> _splitting;
127
129
134 std::set<int> _hasSplit;
135
136
137 constexpr static int NoJoin = -1;
142 std::set< int > _joinTriggered;
143
147 std::set< int > _joining;
148
149 //typedef peano4::maps::STDStackMap< peano4::stacks::GridVertexStack > GridVertexStackMap;
151
153
158 std::vector< peano4::grid::GridControlEvent > _gridControlEvents;
159
176 const AutomatonState& fineGridState,
177 GridVertex coarseGridVertices[TwoPowerD],
178 GridVertex fineGridVertices[TwoPowerD]
179 );
180
202 GridVertex coarseGridVertices[TwoPowerD],
203 GridVertex fineGridVertices[TwoPowerD]
204 ) const;
205
206
218 GridVertex vertex,
219 bool splittingIsConsideredLocal,
220 bool joiningIsConsideredLocal
221 ) const;
222
223
232 bool doesRankIndexIdentifyHorizontalDataExchange(int rank, bool calledByReceivingProcess) const;
233
249 void descend(
250 const AutomatonState& state,
251 GridVertex vertices[TwoPowerD],
252 TraversalObserver& observer
253 );
254
261
272 static void refineState(
273 const AutomatonState& coarseGrid,
274 AutomatonState fineGrid[ThreePowerD],
276 int axis = Dimensions-1
277 );
278
288 GridVertex vertices[TwoPowerD],
289 bool splittingIsConsideredLocal,
290 bool joiningIsConsideredLocal
291 ) const;
292
293
294
296 GridVertex vertices[TwoPowerD]
297 ) const;
298
300 GridVertex vertices[TwoPowerD]
301 ) const;
302
308 GridVertex vertices[TwoPowerD]
309 ) const;
310
311
327 void loadVertices(
328 const AutomatonState& fineGridState,
329 GridVertex coarseGridVertices[TwoPowerD],
330 GridVertex fineGridVertices[TwoPowerD],
331 const tarch::la::Vector<Dimensions,int>& cellPositionWithin3x3Patch,
332 TraversalObserver& observer
333 );
334
335 void storeVertices(
336 const AutomatonState& fineGridState,
337 GridVertex coarseGridVertices[TwoPowerD],
338 GridVertex fineGridVertices[TwoPowerD],
339 const tarch::la::Vector<Dimensions,int>& cellPositionWithin3x3Patch,
340 TraversalObserver& observer
341 );
342
346 static tarch::la::Vector<Dimensions,int> convertToIntegerVector( const std::bitset<Dimensions>& in );
347
373 GridVertex& vertex,
374 GridVertex fineGridVertices[TwoPowerD],
375 const tarch::la::Vector<Dimensions,int>& fineVertexPositionWithinPatch,
376 TraversalObserver& observer
377 );
378
390 GridTraversalEvent& event
391 ) const;
392
393
394
395
406 void receiveAndMergeUserData(const AutomatonState& state, TraversalObserver& observer, const GridTraversalEvent& enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD]);
407
450 void sendUserData(const AutomatonState& state, TraversalObserver& observer, const GridTraversalEvent& enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD]);
451
452
457 std::vector<int> _splittedCells;
458
541 GridVertex vertex[TwoPowerD],
542 GridVertex fineGridVertices[TwoPowerD]
543 );
544
569 void splitCellTopDown(
570 GridVertex vertex[TwoPowerD],
571 GridVertex fineGridVertices[TwoPowerD]
572 );
573
627 GridVertex vertex[TwoPowerD],
628 GridVertex fineGridVertices[TwoPowerD]
629 );
630
645 const GridVertex& vertex,
646 GridVertex coarseGridVertices[TwoPowerD],
647 tarch::la::Vector<Dimensions,int> fineVertexPositionWithinPatch
648 ) const;
649
710 GridVertex& vertex,
711 GridVertex fineGridVertices[TwoPowerD],
712 const tarch::la::Vector<Dimensions,int>& fineVertexPositionWithinPatch
713 );
714
718 static bool restrictToCoarseGrid(
719 const tarch::la::Vector<Dimensions,int>& coarseVertexPosition,
720 const tarch::la::Vector<Dimensions,int>& fineVertexPosition
721 );
722
735 static void updateVertexRanksWithinCell(
736 GridVertex fineGridVertices[TwoPowerD],
737 int newId
738 );
739
744 GridVertex coarseGridVertices[TwoPowerD],
745 const tarch::la::Vector<Dimensions,int>& vertexPositionWithin3x3Patch
746 ) const;
747
767 void split(int treeId, const SplitInstruction& instruction);
768
790 std::set<int> getNeighbourTrees( const GridVertex& vertex, bool calledByReceivingProcess ) const;
791
813 int getNeighbourTrees( GridVertex vertex[TwoPowerD], int faceNumber, bool calledByReceivingProcess ) const;
814
815 bool isFaceAlongPeriodicBoundaryCondition(GridVertex vertex[TwoPowerD], int faceNumber, bool calledByReceivingProcess) const;
816
817
832 void sendGridVertex( const GridVertex& vertex );
833
909
930
937 void mergeGridVertexRefinementStateAtHorizontalDomainBoundary( GridVertex& vertex, const GridVertex& inVertex, int neighbour );
938 void mergeGridVertexAdjacencyListsAtHorizontalDomainBoundary( GridVertex& vertex, const GridVertex& inVertex, int neighbour );
939
947 Spacetree(
948 int newId,
949 int masterId,
952 bool traversalInverted
953 );
954
963 void joinWithMaster();
964 void joinWithWorker(int id);
965
975 bool mayJoinWithMaster() const;
976
980 bool mayJoinWithWorker() const;
981
993 bool maySplit() const;
994
998 int getSplittingTree() const;
999
1015 void updateSplittingCounter( int treeId );
1016 public:
1017 Spacetree(
1020 const std::bitset<Dimensions>& periodicBC = 0
1021 );
1022
1023 ~Spacetree();
1024
1034 void traverse(TraversalObserver& observer, bool calledFromSpacetreeSet = false);
1035
1037
1038 std::string toString() const;
1039
1040 bool isInvolvedInJoinOrFork() const;
1041};
#define ThreePowerD
Definition Globals.h:24
#define TwoPowerD
Definition Globals.h:19
AutomatonState state
std::bitset< Dimensions > periodicBC
Definition main.cpp:19
Translate grid traversal automaton's transitions into user events.
Represents one tree.
Definition Spacetree.h:40
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.
void split(int treeId, const SplitInstruction &instruction)
Add a split instruction.
static tarch::logging::Log _log
Definition Spacetree.h:58
void mergeGridVertexAdjacencyListsAtHorizontalDomainBoundary(GridVertex &vertex, const GridVertex &inVertex, int neighbour)
void storeVertices(const AutomatonState &fineGridState, GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &cellPositionWithin3x3Patch, TraversalObserver &observer)
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...
GridStatistics getGridStatistics() const
void sendUserData(const AutomatonState &state, TraversalObserver &observer, const GridTraversalEvent &enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD])
Send user data.
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 constexpr int NoJoin
Definition Spacetree.h:137
std::set< int > _hasSplit
I need this post-mortem list to identify which tree structures have to be copied/replicated where.
Definition Spacetree.h:134
static GridVertexStackMap _vertexStack
Definition Spacetree.h:152
peano4::maps::HierarchicalStackMap< peano4::stacks::GridVertexStack > GridVertexStackMap
Definition Spacetree.h:150
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...
void markVerticesAroundForkedCell(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD]) const
setIsAntecessorOfRefinedVertexInCurrentTreeSweep()
std::set< int > _joining
If master: Set of workers that should join.
Definition Spacetree.h:147
bool areAllVerticesRefined(GridVertex vertices[TwoPowerD]) const
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 mayJoinWithMaster() const
Only ranks that have no kids are allowed to join.
std::string toString() const
void joinWithWorker(int id)
GridStatistics _statistics
Definition Spacetree.h:99
static constexpr int RankOfPeriodicBoundaryCondition
Periodic boundary conditions are technically realised as domain decomposition, i.e.
Definition Spacetree.h:54
static void incrementNumberOfAdjacentRefinedLocalCells(GridVertex vertices[TwoPowerD])
Every local refined cell should call this routine.
std::set< int > _childrenIds
Definition Spacetree.h:110
void receiveAndMergeUserData(const AutomatonState &state, TraversalObserver &observer, const GridTraversalEvent &enterCellTraversalEvent, GridVertex fineGridVertices[TwoPowerD])
bool areAllVerticesUnrefined(GridVertex vertices[TwoPowerD]) const
bool isFaceAlongPeriodicBoundaryCondition(GridVertex vertex[TwoPowerD], int faceNumber, bool calledByReceivingProcess) const
void descend(const AutomatonState &state, GridVertex vertices[TwoPowerD], TraversalObserver &observer)
bool isSpacetreeNodeLocal(GridVertex vertices[TwoPowerD], bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
Wrapper around GridTraversalEventGenerator::isSpacetreeNodeLocal()
const std::bitset< Dimensions > _periodicBC
Indicate per axis whether we have periodic boundary conditions.
Definition Spacetree.h:115
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.
Definition Spacetree.cpp:48
static tarch::la::Vector< Dimensions, int > convertToIntegerVector(const std::bitset< Dimensions > &in)
Little helper.
std::set< int > getNeighbourTrees(const GridVertex &vertex, bool calledByReceivingProcess) const
Get the ids of the surrounding cells of a vertex.
void splitOrJoinCellBottomUp(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Realise the splits and joins.
SpacetreeState _spacetreeState
Definition Spacetree.h:90
void joinWithMaster()
Join with master.
static constexpr int NumberOfStationarySweepsToWaitAtLeastTillJoin
Definition Spacetree.h:55
void sendGridVertex(const GridVertex &vertex)
This one is to be invoked if and only if a vertex goes to the in/out stacks.
AutomatonState _root
The root of a spacetree corresponds to the initial state of the tree traversal automaton.
Definition Spacetree.h:97
std::set< int > _splitting
Definition Spacetree.h:126
std::vector< peano4::grid::GridControlEvent > _gridControlEvents
We get these control events when we kick off the traversal and then realise/interpret them.
Definition Spacetree.h:158
void evaluateGridControlEvents(const AutomatonState &fineGridState, GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Should only be called for inner cells.
bool isVertexAdjacentToLocalSpacetree(GridVertex vertex, bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
Returns if a vertex is local to adjacent tree.
Definition Spacetree.cpp:82
int _masterId
This is not a static master.
Definition Spacetree.h:109
static void updateVertexRanksWithinCell(GridVertex fineGridVertices[TwoPowerD], int newId)
If a cell gets a new id, we have to update its vertices.
GridTraversalEventGenerator _gridTraversalEventGenerator
Definition Spacetree.h:128
void mergeGridVertexRefinementStateAtHorizontalDomainBoundary(GridVertex &vertex, const GridVertex &inVertex, int neighbour)
Called by receiveAndMergeGridVertexAtHorizontalBoundary().
void updateVertexBeforeStore(GridVertex &vertex, GridVertex fineGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &fineVertexPositionWithinPatch)
bool maySplit() const
Is the tree in principle allowed to split.
bool doesRankIndexIdentifyHorizontalDataExchange(int rank, bool calledByReceivingProcess) const
You may exchange data horizontally with rank if and only if.
void traverse(TraversalObserver &observer, bool calledFromSpacetreeSet=false)
bool mayJoinWithWorker() const
We allow at most one join at a time and not while we split.
std::vector< int > _splittedCells
Definition Spacetree.h:457
std::set< int > _joinTriggered
This should be -1 if no join is triggered.
Definition Spacetree.h:142
SplitSpecification _splitTriggered
A split is identified by a tuple of id and cell count which tells the code how many cells should go t...
Definition Spacetree.h:124
void receiveAndMergeGridVertexAtVerticalBoundary(GridVertex &vertex)
This is a merge routine for vertical data exchange.
void receiveAndMergeGridVertexAtHorizontalBoundary(GridVertex &vertex)
Manage the data exchange after a vertex is loaded for the first time.
bool shouldEraseAdjacencyInformation(const GridVertex &vertex, GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > fineVertexPositionWithinPatch) const
void updateSplittingCounter(int treeId)
Reduce splitting counter.
void mergeCellFromWorkerWithMasterThroughoutJoin(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Merge data from worker with master data throughout join.
void splitCellTopDown(GridVertex vertex[TwoPowerD], GridVertex fineGridVertices[TwoPowerD])
Split cell in a top down fashion.
tarch::la::Vector< TwoPowerD, int > getAdjacentRanksForNewVertex(GridVertex coarseGridVertices[TwoPowerD], const tarch::la::Vector< Dimensions, int > &vertexPositionWithin3x3Patch) const
bool areAllVerticesNonHanging(GridVertex vertices[TwoPowerD]) const
Could also be called areAllVerticesPersistent() in the Peano terminology.
Definition Spacetree.cpp:97
bool isCellSplitCandidate(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD]) const
Can a cell be split (deployed to another rank)
The spacetree set has to be a singleton, as it is reponsible to accept requests for new trees from re...
Log Device.
Definition Log.h:516
The parallel namespace is Peano's core abstracts from both MPI and multicore parallelisation.
std::map< int, SplitInstruction > SplitSpecification
Definition grid.h:44
Instruction to split.
Definition grid.h:34
Simple vector class.
Definition Vector.h:134