17 [[maybe_unused]]
const std::set<int>& splitting,
18 [[maybe_unused]]
const std::set< int >& joinTriggered,
19 [[maybe_unused]]
const std::set< int >& joining
21 std::bitset<TwoPowerD> bitset;
23 bitset.set(i,isVertexAdjacentToLocalSpacetree(vertices[i], splitTriggered, splitting, joinTriggered, joining,
true,
true));
25 logDebug(
"areVerticesLocal(...)", bitset );
32 [[maybe_unused]]
const std::set<int>& splitting,
33 [[maybe_unused]]
const std::set< int >& joinTriggered,
34 [[maybe_unused]]
const std::set< int >& joining
36 std::bitset<TwoTimesD> result;
37 for (
int faceNumber=0; faceNumber<2*Dimensions; faceNumber++) {
40 const int normal = faceNumber % Dimensions;
42 std::bitset<Dimensions> studiedVertex = i;
43 studiedVertex.set(normal,faceNumber>=Dimensions);
44 std::bitset<Dimensions> studiedEntry =
TwoPowerD - studiedVertex.to_ulong() - 1;
46 studiedEntry.set(normal,0);
47 int currentRank = vertices[studiedVertex.to_ulong()].getAdjacentRanks( studiedEntry.to_ulong() );
51 faceNumber>=Dimensions
53 isLocal |= currentRank == _id;
54 isLocal |= splitTriggered.count(currentRank)>0;
55 isLocal |= splitting.count(currentRank)>0;
58 studiedEntry.set(normal,1);
64 currentRank = vertices[studiedVertex.to_ulong()].getAdjacentRanks( studiedEntry.to_ulong() );
65 isLocal |= currentRank == _id;
66 isLocal |= splitTriggered.count(currentRank)>0;
67 isLocal |= splitting.count(currentRank)>0;
71 result[faceNumber] = isLocal;
79 [[maybe_unused]]
const std::set<int>& splitting,
80 [[maybe_unused]]
const std::set< int >& joinTriggered,
81 [[maybe_unused]]
const std::set< int >& joining,
82 [[maybe_unused]]
bool splittingIsConsideredLocal,
83 [[maybe_unused]]
bool joiningIsConsideredLocal
91 logTraceInWith3Arguments(
"isVertexAdjacentToLocalSpacetree(...)", vertex.toString(), splittingIsConsideredLocal, joiningIsConsideredLocal );
94 assertion( splitTriggered.count( vertex.getAdjacentRanks(i) )<=1 );
95 assertion( splitting.count( vertex.getAdjacentRanks(i) )<=1 );
97 result |= vertex.getAdjacentRanks(i)==_id;
99 result |= splitTriggered.count( vertex.getAdjacentRanks(i) )==1;
100 result |= (splittingIsConsideredLocal and splitting.count( vertex.getAdjacentRanks(i) )==1);
102 result |= (joiningIsConsideredLocal and joining.count( vertex.getAdjacentRanks(i) )==1);
112 [[maybe_unused]]
const std::set<int>& splitting,
113 [[maybe_unused]]
const std::set< int >& joinTriggered,
114 [[maybe_unused]]
const std::set< int >& joining,
115 [[maybe_unused]]
bool splittingIsConsideredLocal,
116 [[maybe_unused]]
bool joiningIsConsideredLocal
124 vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1)==_id
127 ( splitTriggered.count(vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1)) > 0)
130 splittingIsConsideredLocal and splitting.count(vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1))>0
134 joiningIsConsideredLocal and joining.count(vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1))>0
145 [[maybe_unused]]
const std::set<int>& splitting,
146 [[maybe_unused]]
const std::set< int >& joinTriggered,
147 [[maybe_unused]]
const std::set< int >& joining,
148 [[maybe_unused]]
bool calledByLeaveCell
150 std::bitset<TwoPowerD> result;
153 bool oneLocal =
false;
154 bool oneRemote =
false;
157 bool local = adjacency(i)==_id or splitting.count(adjacency(i))>0 or splitTriggered.count(adjacency(i))>0;
158 oneLocal |= (valid and local);
159 oneRemote |= (valid and not local);
161 result.set(j,oneLocal and oneRemote);
169 [[maybe_unused]]
const std::set<int>& splitting,
170 [[maybe_unused]]
const std::set< int >& joinTriggered,
171 [[maybe_unused]]
const std::set< int >& joining,
172 [[maybe_unused]]
bool calledByLeaveCell
174 std::bitset<TwoTimesD> result;
179 bool oneLocal =
false;
180 bool oneRemote =
false;
193 bool local = adjacency(i)==_id
194 or splitTriggered.count(adjacency(i))>0
196 or (splitting.count(adjacency(i))>0 and not calledByLeaveCell);
197 bool remote = adjacency(i)!=_id
198 and not (splitTriggered.count(adjacency(i))>0)
199 and (splitting.count(adjacency(i))==0 or calledByLeaveCell);
202 oneLocal |= (valid and local);
203 oneRemote |= (valid and remote);
205 result.set(j,oneLocal and oneRemote);
215 [[maybe_unused]]
const std::set<int>& splitting,
216 [[maybe_unused]]
const std::set< int >& joinTriggered,
217 [[maybe_unused]]
const std::set< int >& joining,
219 [[maybe_unused]]
bool spacetreeStateIsRunning
222 logTraceInWith7Arguments(
"createGenericCellTraversalEvent(...)",
state.
toString(), relativePositionToFather, fineGridVertices[0].toString(), fineGridVertices[1].toString(), fineGridVertices[2].toString(), fineGridVertices[3].toString(), _id );
232 event.setRelativePositionToFather( relativePositionToFather );
234 event.setIsCellLocal(
isSpacetreeNodeLocal( fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
true,
true) );
236 event.setIsFaceLocal( areFacesLocal( fineGridVertices, splitTriggered, splitting, joinTriggered, joining) );
237 event.setIsVertexLocal( areVerticesLocal( fineGridVertices, splitTriggered, splitting, joinTriggered, joining) );
239 event.setIsParentVertexLocal( areVerticesLocal( coarseGridVertices, splitTriggered, splitting, joinTriggered, joining) );
241 event.setInvokingSpacetree( _id );
242 event.setInvokingSpacetreeIsNotInvolvedInAnyDynamicLoadBalancing(
243 spacetreeStateIsRunning and
244 joinTriggered.empty() and
246 splitTriggered.empty() and
250 event.setIsAdjacentCellLocal(0);
255 int owningTree = fineGridVertices[kScalar].getAdjacentRanks(jScalar);
256 event.setIsAdjacentCellLocal(
260 event.setIsVertexParentOfSubtree( fineGridVertices[kScalar].getHasBeenParentOfSubtreeVertexInPreviousTreeSweep() );
266 std::set<int> neighbourIds;
269 if (fineGridVertices[kScalar].getAdjacentRanks(i)>=0) {
270 neighbourIds.insert(fineGridVertices[kScalar].getAdjacentRanks(i));
274 event.setNumberOfAdjacentTreesPerVertex(kScalar,neighbourIds.size());
286 [[maybe_unused]]
const std::set<int>& splitting,
287 [[maybe_unused]]
const std::set< int >& joinTriggered,
288 [[maybe_unused]]
const std::set< int >& joining,
289 [[maybe_unused]]
const std::set< int >& hasSplit,
291 [[maybe_unused]]
bool spacetreeStateIsRunning
294 GridTraversalEvent event = createGenericCellTraversalEvent(coarseGridVertices, fineGridVertices,
state, splitTriggered, splitting, joinTriggered, joining, relativePositionToFather, spacetreeStateIsRunning);
296 event.setIsVertexAdjacentToParallelDomainBoundary( areVerticesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
true) );
297 event.setIsFaceAdjacentToParallelDomainBoundary( areFacesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
true));
301 const std::bitset<Dimensions> vertexIndex( coordinates ^ std::bitset<Dimensions>(i) );
304 event.setVertexDataFrom(i,vertexIndex.to_ulong());
305 switch ( fineGridVertices[vertexIndex.to_ulong()].getState() ) {
316 event.setVertexDataTo(i,stackNumber);
324 event.setVertexDataTo(i,stackNumber);
333 not event.getIsVertexLocal(vertexIndex.to_ulong())
336 "createLeaveCellTraversalEvent(...)",
337 "reset event entry " << i <<
" to no-data as we have " << event.toString()
338 <<
". vertex=" << fineGridVertices[vertexIndex.to_ulong()].toString()
344 for (
int i=0; i<2*Dimensions; i++) {
346 FaceType type = getFaceType(coarseGridVertices,relativePositionToFather,faceIndex);
349 event.setFaceDataFrom(i,faceIndex);
357 event.setFaceDataTo(i,stackNumber);
364 event.setFaceDataTo(i,stackNumber);
372 not event.getIsFaceLocal(faceIndex)
379 CellType type = getCellType(coarseGridVertices,relativePositionToFather);
384 event.setCellData(stackNumber);
387 event.setCellData(stackNumber);
398 not event.getIsCellLocal()
404 #if !defined(SharedMemoryParallelisation)
406 assertion1( event.getIsVertexLocal(i) or not event.getIsVertexAdjacentToParallelDomainBoundary(i), event.toString() );
408 assertion1( event.getIsFaceLocal(i) or not event.getIsFaceAdjacentToParallelDomainBoundary(i), event.toString() );
480 [[maybe_unused]]
const std::set<int>& splitting,
481 [[maybe_unused]]
const std::set< int >& joinTriggered,
482 [[maybe_unused]]
const std::set< int >& joining,
483 [[maybe_unused]]
const std::set< int >& hasSplit,
485 [[maybe_unused]]
bool spacetreeStateIsRunning
487 logTraceInWith7Arguments(
"createEnterCellTraversalEvent(...)",
state.
toString(), _id, relativePositionToFather, coarseGridVertices[0].toString(), coarseGridVertices[1].toString(), coarseGridVertices[2].toString(), coarseGridVertices[3].toString() );
488 GridTraversalEvent event = createGenericCellTraversalEvent(coarseGridVertices, fineGridVertices,
state, splitTriggered, splitting, joinTriggered, joining, relativePositionToFather, spacetreeStateIsRunning);
490 event.setIsVertexAdjacentToParallelDomainBoundary( areVerticesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
false) );
491 event.setIsFaceAdjacentToParallelDomainBoundary( areFacesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
false));
493 #if !defined(SharedMemoryParallelisation)
495 assertion1( event.getIsVertexLocal(i) or not event.getIsVertexAdjacentToParallelDomainBoundary(i), event.toString() );
497 assertion1( event.getIsFaceLocal(i) or not event.getIsFaceAdjacentToParallelDomainBoundary(i), event.toString() );
502 const std::bitset<Dimensions> vertexIndex( coordinates ^ std::bitset<Dimensions>(i) );
504 const int vertexPosition = vertexIndex.to_ulong();
506 switch ( fineGridVertices[vertexPosition].getState() ) {
516 event.setVertexDataFrom(i,stackNumber);
527 event.setVertexDataFrom(i,stackNumber);
530 event.setVertexDataTo(i,vertexIndex.to_ulong());
532 bool mayResetToNoData =
535 not
event.getIsVertexLocal(vertexPosition);
537 for (
auto p: hasSplit) {
538 mayResetToNoData &= not
tarch::la::contains( fineGridVertices[vertexPosition].getAdjacentRanks(), p );
541 if (mayResetToNoData) {
546 "createEnterCellTraversalEvent(...)",
547 "vertex " << i <<
" on on tree " << _id <<
": " <<
548 event.toString() <<
", mayResetToNoData=" << mayResetToNoData <<
549 ", is-local=" << event.getIsVertexLocal(vertexPosition) <<
", is in-out=" <<
PeanoCurve::isInOutStack(event.getVertexDataFrom(i))
550 <<
", vertex[0]=" << fineGridVertices[0].toString()
551 <<
", vertex[1]=" << fineGridVertices[1].toString()
552 <<
", vertex[2]=" << fineGridVertices[2].toString()
553 <<
", vertex[3]=" << fineGridVertices[3].toString()
554 <<
", vertex[4]=" << fineGridVertices[4].toString()
555 <<
", vertex[5]=" << fineGridVertices[5].toString()
556 <<
", vertex[6]=" << fineGridVertices[6].toString()
557 <<
", vertex[7]=" << fineGridVertices[7].toString()
561 for (
int i=0; i<2*Dimensions; i++) {
563 FaceType type = getFaceType(coarseGridVertices,relativePositionToFather,faceIndex);
573 event.setFaceDataFrom(i,stackNumber);
582 event.setFaceDataFrom(i,stackNumber);
585 event.setFaceDataTo(i,faceIndex);
587 bool mayResetToNoData =
590 not
event.getIsFaceLocal(faceIndex);
592 for (
auto p: hasSplit) {
593 mayResetToNoData &= not
tarch::la::contains( getAdjacentRanksOfFace(fineGridVertices, faceIndex,
false), p );
596 if (mayResetToNoData) {
602 CellType type = getCellType(coarseGridVertices,relativePositionToFather);
609 event.setCellData(stackNumber);
612 event.setCellData(stackNumber);
617 bool mayResetToNoData =
621 not
event.getIsCellLocal();
623 for (
auto p: hasSplit) {
624 mayResetToNoData &= getTreeOwningSpacetreeNode(fineGridVertices, splitTriggered, splitting, joinTriggered, joining)!=p;
627 if (mayResetToNoData) {
631 #if !defined(SharedMemoryParallelisation)
633 assertion1( event.getIsVertexLocal(i) or not event.getIsVertexAdjacentToParallelDomainBoundary(i), event.toString() );
635 assertion1( event.getIsFaceLocal(i) or not event.getIsFaceAdjacentToParallelDomainBoundary(i), event.toString() );
646 [[maybe_unused]]
int faceNumber
650 bool allVerticesAreHanging =
true;
651 bool allVerticesAreDeleteOrHanging =
true;
652 bool allVerticesAreNewOrHanging =
true;
654 const int normal = faceNumber % Dimensions;
656 std::bitset<Dimensions> studiedVertex = i;
657 studiedVertex.set(normal,faceNumber>=Dimensions);
662 allVerticesAreDeleteOrHanging =
false;
663 allVerticesAreHanging =
false;
666 allVerticesAreHanging =
false;
667 allVerticesAreDeleteOrHanging =
false;
668 allVerticesAreNewOrHanging =
false;
671 allVerticesAreHanging =
false;
672 allVerticesAreNewOrHanging =
false;
678 if ( allVerticesAreHanging ) {
681 else if ( allVerticesAreNewOrHanging ) {
684 else if ( allVerticesAreDeleteOrHanging ) {
697 bool allVerticesAreDelete =
true;
698 bool allVerticesAreNew =
true;
701 std::bitset<Dimensions> vectorPosition = i;
706 allVerticesAreDelete =
false;
707 allVerticesAreNew =
false;
710 allVerticesAreDelete =
false;
713 allVerticesAreNew =
false;
718 assertion( not (allVerticesAreDelete and allVerticesAreNew) );
720 if (allVerticesAreDelete) {
721 logDebug(
"getCellType(...)",
"delete cell" );
724 else if (allVerticesAreNew) {
725 logDebug(
"getCellType(...)",
"create new cell" );
729 logDebug(
"getCellType(...)",
"keep cell" );
739 #if Dimensions==2 or Dimensions==3
762 return getVertexType(
773 [[maybe_unused]]
int dimension
796 else if ( position(dimension)==0 ) {
797 position(dimension)=0;
798 return getVertexType(coarseGridVertices,position,dimension-1);
800 else if ( position(dimension)==3 ) {
801 position(dimension)=1;
802 return getVertexType(coarseGridVertices,position,dimension-1);
806 position(dimension)=0;
809 position(dimension)=1;
852 [[maybe_unused]]
const std::set<int>& splitting,
853 [[maybe_unused]]
const std::set< int >& joinTriggered,
854 [[maybe_unused]]
const std::set< int >& joining
856 const int NotSetYet = -1;
859 int weakId = NotSetYet;
866 weakId = vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1);
871 isVertexAdjacentToLocalSpacetree(vertices[kScalar], splitTriggered, splitting, joinTriggered, joining,
true,
false)
876 vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1)==
id,
877 id, kScalar, vertices[kScalar].
toString(),
881 id = vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1);
898 const int normal = faceNumber % Dimensions;
899 dfore( i, 2, normal, faceNumber<Dimensions ? 0 : 1 ) {
902 std::bitset<Dimensions> studiedEntry =
TwoPowerD - currentVertex - 1;
903 studiedEntry[normal] = 0;
904 assertion3(studiedEntry.to_ullong()>=0, studiedEntry,currentVertex,i);
906 int rankEntry = calledByReceivingProcess ? fineGridVertices[currentVertex].getBackupOfAdjacentRanks(studiedEntry.to_ullong())
907 : fineGridVertices[currentVertex].getAdjacentRanks(studiedEntry.to_ullong());
919 adjacentRanksOfFace(counter) = rankEntry;
922 studiedEntry[normal] = 1;
923 assertion3(studiedEntry.to_ullong()>=0, studiedEntry,currentVertex,i);
925 rankEntry = calledByReceivingProcess ? fineGridVertices[currentVertex].getBackupOfAdjacentRanks(studiedEntry.to_ullong())
926 : fineGridVertices[currentVertex].getAdjacentRanks(studiedEntry.to_ullong());
938 adjacentRanksOfFace(counter) = rankEntry;
942 return adjacentRanksOfFace;
#define assertion8(expr, param0, param1, param2, param3, param4, param5, param6, param7)
#define assertion3(expr, param0, param1, param2)
#define assertion1(expr, param)
#define logDebug(methodName, logMacroMessageStream)
#define logTraceOutWith1Argument(methodName, argument0)
#define logTraceOutWith3Arguments(methodName, argument0, argument1, argument2)
#define logTraceInWith3Arguments(methodName, argument0, argument1, argument2)
#define logTraceOutWith4Arguments(methodName, argument0, argument1, argument2, argument3)
#define logTraceOutWith2Arguments(methodName, argument0, argument1)
#define logTraceInWith1Argument(methodName, argument0)
#define logTraceInWith7Arguments(methodName, argument0, argument1, argument2, argument3, argument4, argument5, argument6)
#define logTraceInWith2Arguments(methodName, argument0, argument1)
#define dfor2(counter)
Shortcut For dfor(counter,2)
#define dfore(counter, max, dim, value)
This is an exclusive d-dimensional for loop.
#define enddforx
I prefer to use this macro for dforx instead of a closing bracket as many syntax parser fail otherwis...
static CellType getCellType(GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > positionOfCell)
You pass in the vertices and it gives you back the cell type.
int getTreeOwningSpacetreeNode(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining) const
We run over the adjacent vertices of the cell and look at each vertex's adjacency list.
static FaceType getFaceType(GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > positionOfCell, int faceNumber)
Identify type of vertex.
tarch::la::Vector< TwoPowerD, int > getAdjacentRanksOfFace(GridVertex vertex[TwoPowerD], int faceNumber, bool useBackedUpAdjacencyInformation) const
GridTraversalEvent createGenericCellTraversalEvent(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const AutomatonState &state, const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, const tarch::la::Vector< Dimensions, int > &relativePositionToFather, bool spacetreeStateIsRunning) const
bool isSpacetreeNodeLocal(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
A spacetree node as 2^d adjacent vertices.
static VertexType getVertexType(GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > position, int dimension)
Simple recursive type analysis.
std::bitset< TwoPowerD > areVerticesLocal(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining) const
Vertices are local.
bool isVertexAdjacentToLocalSpacetree(GridVertex vertex, const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, bool splittingIsConsideredLocal, bool joiningIsConsideredLocal) const
Study the adjacency flags and do ignore hanging nodes.
GridTraversalEvent createEnterCellTraversalEvent(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const AutomatonState &state, const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, const std::set< int > &hasSplit, const tarch::la::Vector< Dimensions, int > &relativePositionToFather, bool spacetreeStateIsRunning) const
Create description of an enter cell traversal.
GridTraversalEvent createPrunedEnterCellTraversalEvent(SpacetreeState spacetreeState, const GridTraversalEvent &event) const
When we fork or join, the worker's locality analysis identifies local vertices and faces.
GridTraversalEventGenerator(int id)
GridTraversalEvent createLeaveCellTraversalEvent(GridVertex coarseGridVertices[TwoPowerD], GridVertex fineGridVertices[TwoPowerD], const AutomatonState &state, const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, const std::set< int > &hasSplit, const tarch::la::Vector< Dimensions, int > &relativePositionToFather, bool spacetreeStateIsRunning) const
Create description of a leave cell traversal.
std::bitset< TwoTimesD > areFacesLocal(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining) const
Identifies for the faces whether they are local or not.
static tarch::logging::Log _log
std::bitset< TwoPowerD > areVerticesAdjacentToParallelDomainBoundary(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, bool calledByLeaveCell) const
A vertex is inside the domain, if all of its ids equal _id.
GridTraversalEvent createPrunedLeaveCellTraversalEvent(SpacetreeState spacetreeState, const GridTraversalEvent &event) const
std::bitset< TwoTimesD > areFacesAdjacentToParallelDomainBoundary(GridVertex vertices[TwoPowerD], const SplitSpecification &splitTriggered, const std::set< int > &splitting, const std::set< int > &joinTriggered, const std::set< int > &joining, bool calledByLeaveCell) const
static int getVertexWriteStackNumber(const AutomatonState &state, const std::bitset< Dimensions > &vertex)
static int getCellReadStackNumber(const AutomatonState &state)
static int getFaceWriteStackNumber(const AutomatonState &state, int face)
static int getFaceNumberAlongCurve(const AutomatonState &state, int logicalFaceNumber)
Faces are enumerated following the same paradigm as the vertices.
static bool isInOutStack(int number)
static int getVertexReadStackNumber(const AutomatonState &state, const std::bitset< Dimensions > &vertex)
static int getCellWriteStackNumber(const AutomatonState &state)
static int getFaceReadStackNumber(const AutomatonState &state, int face)
It is important to get the input/output stack ordering per stack type consistent among all grid entit...
static std::bitset< Dimensions > getFirstVertexIndex(const AutomatonState &cell)
Looks into a cell of the spacetree and gives the index of the first local vertex.
static constexpr int RankOfPeriodicBoundaryCondition
Periodic boundary conditions are technically realised as domain decomposition, i.e.
static constexpr int CreateOrDestroyHangingGridEntity
Implies that the data will then be local or had been local.
static constexpr int CreateOrDestroyPersistentGridEntity
Implies that the data will then be local or had been local.
static constexpr int NoData
Can this grid entity hold data.
std::string toString(VertexType type)
bool isSpacetreeNodeLocal(GridVertex vertices[TwoPowerD], bool splittingIsConsideredLocal, bool joiningIsConsideredLocal, int id)
A spacetree node as 2^d adjacent vertices.
@ NewFromSplit
Set if this tree results from a split and if this is the first grid sweep when the former owner actua...
@ EmptyRun
Not yet a new root.
std::bitset< TwoPowerD > haveVerticesBeenRefined(GridVertex vertices[TwoPowerD])
std::bitset< TwoPowerD > willVerticesBeRefined(GridVertex vertices[TwoPowerD])
A vertex is unrefined if it is hanging.
constexpr int InvalidRank(-1)
CPUGPUMethod int dLinearised(const tarch::la::Vector< Dimensions, int > &counter, int max)
Map d-dimensional vector onto integer index.
std::map< int, SplitInstruction > SplitSpecification
bool contains(const Vector< Size, Scalar > &vector, const Scalar &value)
tarch::la::Vector< Dimensions, double > getX() const
std::string toString() const
tarch::la::Vector< Dimensions, double > getH() const
void setIsFaceLocal(const std::bitset< TwoTimesD > &value)
std::string toString() const
void setX(const tarch::la::Vector< Dimensions, double > &value)
void setIsCellLocal(bool value)
void setIsVertexLocal(const std::bitset< TwoPowerD > &value)
void setIsParentCellLocal(bool value)