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() );
478 [[maybe_unused]]
const std::set<int>& splitting,
479 [[maybe_unused]]
const std::set< int >& joinTriggered,
480 [[maybe_unused]]
const std::set< int >& joining,
481 [[maybe_unused]]
const std::set< int >& hasSplit,
483 [[maybe_unused]]
bool spacetreeStateIsRunning
485 logTraceInWith7Arguments(
"createEnterCellTraversalEvent(...)",
state.
toString(), _id, relativePositionToFather, coarseGridVertices[0].toString(), coarseGridVertices[1].toString(), coarseGridVertices[2].toString(), coarseGridVertices[3].toString() );
486 GridTraversalEvent event = createGenericCellTraversalEvent(coarseGridVertices, fineGridVertices,
state, splitTriggered, splitting, joinTriggered, joining, relativePositionToFather, spacetreeStateIsRunning);
488 event.setIsVertexAdjacentToParallelDomainBoundary( areVerticesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
false) );
489 event.setIsFaceAdjacentToParallelDomainBoundary( areFacesAdjacentToParallelDomainBoundary(fineGridVertices, splitTriggered, splitting, joinTriggered, joining,
false));
491 #if !defined(SharedMemoryParallelisation)
493 assertion1( event.getIsVertexLocal(i) or not event.getIsVertexAdjacentToParallelDomainBoundary(i), event.toString() );
495 assertion1( event.getIsFaceLocal(i) or not event.getIsFaceAdjacentToParallelDomainBoundary(i), event.toString() );
500 const std::bitset<Dimensions> vertexIndex( coordinates ^ std::bitset<Dimensions>(i) );
502 const int vertexPosition = vertexIndex.to_ulong();
504 switch ( fineGridVertices[vertexPosition].getState() ) {
514 event.setVertexDataFrom(i,stackNumber);
525 event.setVertexDataFrom(i,stackNumber);
528 event.setVertexDataTo(i,vertexIndex.to_ulong());
530 bool mayResetToNoData =
533 not
event.getIsVertexLocal(vertexPosition);
535 for (
auto p: hasSplit) {
536 mayResetToNoData &= not
tarch::la::contains( fineGridVertices[vertexPosition].getAdjacentRanks(), p );
539 if (mayResetToNoData) {
544 "createEnterCellTraversalEvent(...)",
545 "vertex " << i <<
" on on tree " << _id <<
": " <<
546 event.toString() <<
", mayResetToNoData=" << mayResetToNoData <<
547 ", is-local=" << event.getIsVertexLocal(vertexPosition) <<
", is in-out=" <<
PeanoCurve::isInOutStack(event.getVertexDataFrom(i))
548 <<
", vertex[0]=" << fineGridVertices[0].toString()
549 <<
", vertex[1]=" << fineGridVertices[1].toString()
550 <<
", vertex[2]=" << fineGridVertices[2].toString()
551 <<
", vertex[3]=" << fineGridVertices[3].toString()
552 <<
", vertex[4]=" << fineGridVertices[4].toString()
553 <<
", vertex[5]=" << fineGridVertices[5].toString()
554 <<
", vertex[6]=" << fineGridVertices[6].toString()
555 <<
", vertex[7]=" << fineGridVertices[7].toString()
559 for (
int i=0; i<2*Dimensions; i++) {
561 FaceType type = getFaceType(coarseGridVertices,relativePositionToFather,faceIndex);
571 event.setFaceDataFrom(i,stackNumber);
580 event.setFaceDataFrom(i,stackNumber);
583 event.setFaceDataTo(i,faceIndex);
585 bool mayResetToNoData =
588 not
event.getIsFaceLocal(faceIndex);
590 for (
auto p: hasSplit) {
591 mayResetToNoData &= not
tarch::la::contains( getAdjacentRanksOfFace(fineGridVertices, faceIndex,
false), p );
594 if (mayResetToNoData) {
600 CellType type = getCellType(coarseGridVertices,relativePositionToFather);
607 event.setCellData(stackNumber);
610 event.setCellData(stackNumber);
615 bool mayResetToNoData =
619 not
event.getIsCellLocal();
621 for (
auto p: hasSplit) {
622 mayResetToNoData &= getTreeOwningSpacetreeNode(fineGridVertices, splitTriggered, splitting, joinTriggered, joining)!=p;
625 if (mayResetToNoData) {
629 #if !defined(SharedMemoryParallelisation)
631 assertion1( event.getIsVertexLocal(i) or not event.getIsVertexAdjacentToParallelDomainBoundary(i), event.toString() );
633 assertion1( event.getIsFaceLocal(i) or not event.getIsFaceAdjacentToParallelDomainBoundary(i), event.toString() );
643 [[maybe_unused]]
int faceNumber
647 bool allVerticesAreHanging =
true;
648 bool allVerticesAreDeleteOrHanging =
true;
649 bool allVerticesAreNewOrHanging =
true;
651 const int normal = faceNumber % Dimensions;
653 std::bitset<Dimensions> studiedVertex = i;
654 studiedVertex.set(normal,faceNumber>=Dimensions);
659 allVerticesAreDeleteOrHanging =
false;
660 allVerticesAreHanging =
false;
663 allVerticesAreHanging =
false;
664 allVerticesAreDeleteOrHanging =
false;
665 allVerticesAreNewOrHanging =
false;
668 allVerticesAreHanging =
false;
669 allVerticesAreNewOrHanging =
false;
675 if ( allVerticesAreHanging ) {
678 else if ( allVerticesAreNewOrHanging ) {
681 else if ( allVerticesAreDeleteOrHanging ) {
693 bool allVerticesAreDelete =
true;
694 bool allVerticesAreNew =
true;
697 std::bitset<Dimensions> vectorPosition = i;
702 allVerticesAreDelete =
false;
703 allVerticesAreNew =
false;
706 allVerticesAreDelete =
false;
709 allVerticesAreNew =
false;
714 assertion( not (allVerticesAreDelete and allVerticesAreNew) );
716 if (allVerticesAreDelete) {
717 logDebug(
"getCellType(...)",
"delete cell" );
720 else if (allVerticesAreNew) {
721 logDebug(
"getCellType(...)",
"create new cell" );
725 logDebug(
"getCellType(...)",
"keep cell" );
733 [[maybe_unused]]
int dimension
756 else if ( position(dimension)==0 ) {
757 position(dimension)=0;
758 return getVertexType(coarseGridVertices,position,dimension-1);
760 else if ( position(dimension)==3 ) {
761 position(dimension)=1;
762 return getVertexType(coarseGridVertices,position,dimension-1);
766 position(dimension)=0;
769 position(dimension)=1;
811 [[maybe_unused]]
const std::set<int>& splitting,
812 [[maybe_unused]]
const std::set< int >& joinTriggered,
813 [[maybe_unused]]
const std::set< int >& joining
815 const int NotSetYet = -1;
818 int weakId = NotSetYet;
825 weakId = vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1);
830 isVertexAdjacentToLocalSpacetree(vertices[kScalar], splitTriggered, splitting, joinTriggered, joining,
true,
false)
835 vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1)==
id,
836 id, kScalar, vertices[kScalar].
toString(),
840 id = vertices[kScalar].getAdjacentRanks(
TwoPowerD-kScalar-1);
856 const int normal = faceNumber % Dimensions;
857 dfore( i, 2, normal, faceNumber<Dimensions ? 0 : 1 ) {
860 std::bitset<Dimensions> studiedEntry =
TwoPowerD - currentVertex - 1;
861 studiedEntry[normal] = 0;
862 assertion3(studiedEntry.to_ullong()>=0, studiedEntry,currentVertex,i);
864 int rankEntry = calledByReceivingProcess ? fineGridVertices[currentVertex].getBackupOfAdjacentRanks(studiedEntry.to_ullong())
865 : fineGridVertices[currentVertex].getAdjacentRanks(studiedEntry.to_ullong());
877 adjacentRanksOfFace(counter) = rankEntry;
880 studiedEntry[normal] = 1;
881 assertion3(studiedEntry.to_ullong()>=0, studiedEntry,currentVertex,i);
883 rankEntry = calledByReceivingProcess ? fineGridVertices[currentVertex].getBackupOfAdjacentRanks(studiedEntry.to_ullong())
884 : fineGridVertices[currentVertex].getAdjacentRanks(studiedEntry.to_ullong());
896 adjacentRanksOfFace(counter) = rankEntry;
900 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.
static VertexType getVertexType(GridVertex coarseGridVertices[TwoPowerD], tarch::la::Vector< Dimensions, int > position, int dimension=Dimensions-1)
Simple recursive type analysis.
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.
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)