16 std::bitset<Dimensions> influencingEvenFlags =
state.getEvenFlags();
17 influencingEvenFlags.set(axis,
false);
19 bool result = ( influencingEvenFlags.count() % 2) == 0;
20 return result ^
state.getInverted();
28 for (
int i=0; i<Dimensions; i++) {
29 result[i] = isTraversePositiveAlongAxis(
state,i);
36 if ( isTraversePositiveAlongAxis(cell, axis) ) {
37 removeFaceAccessNumber( cell, axis+Dimensions );
38 setFaceAccessNumber( cell, axis+Dimensions, 1 );
41 removeFaceAccessNumber( cell, axis );
42 setFaceAccessNumber( cell, axis, 1 );
48 if ( isTraversePositiveAlongAxis(cell, axis) ) {
49 removeFaceAccessNumber( cell, axis );
50 setFaceAccessNumber( cell, axis, -1 );
53 removeFaceAccessNumber( cell, axis+Dimensions );
54 setFaceAccessNumber( cell, axis+Dimensions, -1 );
72 int oldFaceNumber = accessNumber(face);
74 if (accessNumber(face)>0) {
75 for (
int i=0; i<2*Dimensions; i++)
76 if ( accessNumber(i) >= oldFaceNumber ) accessNumber(i)--;
78 if (accessNumber(face)<0) {
79 for (
int i=0; i<2*Dimensions; i++)
80 if ( accessNumber(i) <= oldFaceNumber ) accessNumber(i)++;
83 accessNumber(face) = 0;
89 std::bitset<Dimensions> result;
90 std::bitset<Dimensions> currentMask;
92 for (
int i=0; i<Dimensions; i++) {
94 currentMask[i] =
true;
97 result ^= currentMask;
100 currentMask[i] =
false;
122 for (
int i=0; i<2*Dimensions; i++)
123 if ( accessNumber(i) >= value ) accessNumber(i)++;
126 for (
int i=0; i<2*Dimensions; i++)
127 if ( accessNumber(i) <= value ) accessNumber(i)--;
130 accessNumber(face) =
static_cast<short int>(value);
146 int smallestValue = -2*Dimensions-1;
147 int result = getInputStackNumber(
state);
150 for (
int d=0; d<Dimensions; d++) {
151 const int face = vertex[d]==0 ? d : d+Dimensions;
153 if (faceAccessNumber<0 && faceAccessNumber>smallestValue) {
154 result = face + NumberOfBaseStacks;
155 smallestValue = faceAccessNumber;
161 result = (result-NumberOfBaseStacks)<Dimensions ? result+Dimensions : result-Dimensions;
170 return number>CallStack and number < NumberOfBaseStacks;
175 return number >= NumberOfBaseStacks;
180 int biggestValue = 2*Dimensions+1;
181 int result = getOutputStackNumber(cell);
184 for (
int d=0; d<Dimensions; d++) {
185 const int face = vertex[d]==0 ? d : d+Dimensions;
187 if (faceAccessNumber>0 && faceAccessNumber<biggestValue) {
188 result = face + NumberOfBaseStacks;
189 biggestValue = faceAccessNumber;
195 result = (result-NumberOfBaseStacks)<Dimensions ? result+Dimensions : result-Dimensions;
205 face = 2*Dimensions - 1 - face;
207 int normal = face % Dimensions;
209 for (
int d=0; d<Dimensions; d++) {
212 result += Dimensions;
215 result += Dimensions;
220 result = result % (2*Dimensions);
226 int result = getInputStackNumber(
state);
227 int direction = face % Dimensions;
230 int newResult = face;
233 newResult = newResult % (2*Dimensions);
234 result = newResult + NumberOfBaseStacks;
243 int result = getOutputStackNumber(cell);
244 int direction = face % Dimensions;
247 int newResult = face;
249 if (cell.
getEvenFlags(direction)) newResult += Dimensions;
250 newResult = newResult % (2*Dimensions);
251 result = newResult + NumberOfBaseStacks;
260 return getInputStackNumber(
state);
265 return getOutputStackNumber(
state);
#define assertion1(expr, param)
static int getVertexWriteStackNumber(const AutomatonState &state, const std::bitset< Dimensions > &vertex)
static constexpr int CallStack
static int getInputStackNumber(const AutomatonState &state)
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 void invertEvenFlag(AutomatonState &cell, int axis)
static void removeFaceAccessNumber(AutomatonState &cell, int face)
static bool isInOutStack(int number)
static int getVertexReadStackNumber(const AutomatonState &state, const std::bitset< Dimensions > &vertex)
static int getOutputStackNumber(const AutomatonState &state)
static peano4::utils::LoopDirection getLoopDirection(const AutomatonState &state)
Holds a set bit for each dimension along which the traversal is positive.
static void setFaceAccessNumber(AutomatonState &cell, int face, int value)
static void setEntryFace(AutomatonState &cell, int axis)
static int getCellWriteStackNumber(const AutomatonState &state)
static bool isTraversePositiveAlongAxis(const AutomatonState &state, int axis)
static bool isTemporaryStack(int number)
static constexpr int NumberOfBaseStacks
By setting the value to something bigger than 2, we effectively reserve NumberOfBaseStacks - 2 as cal...
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 void setExitFace(AutomatonState &cell, int axis)
std::bitset< Dimensions > LoopDirection
Is used by the z-loop.
void setAccessNumber(const tarch::la::Vector< DimensionsTimesTwo, int > &value)
std::bitset< Dimensions > getEvenFlags() const
void flipEvenFlags(int index)
tarch::la::Vector< DimensionsTimesTwo, int > getAccessNumber() const