17 return "aggressive-top-down";
25 std::ostringstream msg;
26 msg <<
"(" <<
toString(mode) <<
",#cells=" << numberOfFineGridCells <<
")";
43 assertion1(upscaleAutomatonState >= 1.0, upscaleAutomatonState);
64 [[maybe_unused]]
int level,
66 [[maybe_unused]]
bool isNewFineGridVertex
90 std::ostringstream msg;
92 for (
int i = 0; i < static_cast<int>(events.size()); i++) {
96 msg << events[i].toString();
103 std::ostringstream msg;
105 for (
auto p : events) {
113 std::vector<GridControlEvent> events, [[maybe_unused]]
const double Tolerance
117 std::list<peano4::grid::GridControlEvent> refineEvents;
118 std::list<peano4::grid::GridControlEvent> eraseEvents;
119 for (
auto p : events) {
120 if (p.getRefinementControl() == GridControlEvent::RefinementControl::Erase) {
121 eraseEvents.push_back(p);
123 refineEvents.push_back(p);
129 << events.size() <<
" event(s) consisting of " << refineEvents.size() <<
" refine and " << eraseEvents.size()
133 internal::removeEraseEventsThatAreCancelledByRefineEvents(refineEvents, eraseEvents);
136 "reduced to " << eraseEvents.size() <<
" erase event(s) by eliminating erase events that overlap with refinement"
139 internal::mergeAdjacentRefinementEvents(refineEvents, Tolerance);
140 internal::mergeAdjacentRefinementEvents(eraseEvents, Tolerance);
141 logDebug(
"merge(...)",
"merged refine events into " << refineEvents.size() <<
" event(s)");
143 std::vector<peano4::grid::GridControlEvent> result;
144 result.insert(result.begin(), refineEvents.begin(), refineEvents.end());
145 result.insert(result.begin(), eraseEvents.begin(), eraseEvents.end());
154 for (
int d = 0; d < Dimensions; d++) {
163 events.sort(compare);
167 const std::list<peano4::grid::GridControlEvent>& refineEvents, std::list<peano4::grid::GridControlEvent>& eraseEvents
169 std::list<peano4::grid::GridControlEvent>::iterator pEraseEvent = eraseEvents.begin();
170 while (pEraseEvent != eraseEvents.end()) {
172 for (
auto refineEvent : refineEvents) {
176 pEraseEvent = eraseEvents.erase(pEraseEvent);
184 std::list<peano4::grid::GridControlEvent>& inputEvents,
int Tolerance
186 bool hasMergedEvents =
true;
187 while (hasMergedEvents) {
188 internal::sort(inputEvents);
189 hasMergedEvents =
false;
191 std::list<peano4::grid::GridControlEvent>::iterator lhs = inputEvents.begin();
192 std::list<peano4::grid::GridControlEvent>::iterator rhs = inputEvents.begin();
195 while (rhs != inputEvents.end()) {
199 "mergeAdjacentRefinementEvents(...)",
200 "merge two adjacent events "
201 << lhs->toString() <<
" and " << rhs->toString() <<
") into " << newEvent.
toString()
204 lhs = inputEvents.erase(rhs);
206 if (rhs != inputEvents.end())
208 hasMergedEvents =
true;
249 return vertex.
getState() == GridVertex::State::Refining or vertex.
getState() == GridVertex::State::Refined
250 or vertex.
getState() == GridVertex::State::EraseTriggered;
254 return vertex.
getState() == GridVertex::State::Refined or vertex.
getState() == GridVertex::State::EraseTriggered
255 or vertex.
getState() == GridVertex::State::Erasing;
259 std::bitset<TwoPowerD> bitset;
268 std::bitset<TwoPowerD> bitset;
278 case VertexType::New:
280 case VertexType::Hanging:
282 case VertexType::Persistent:
284 case VertexType::Delete:
294 case FaceType::Hanging:
296 case FaceType::Persistent:
298 case FaceType::Delete:
308 case CellType::Persistent:
310 case CellType::Delete:
318 case SpacetreeState::EmptyRun:
320 case SpacetreeState::NewRoot:
322 case SpacetreeState::NewFromSplit:
323 return "new-from-split";
324 case SpacetreeState::Running:
326 case SpacetreeState::JoinTriggered:
327 return "join-triggered";
328 case SpacetreeState::Joining:
330 case SpacetreeState::Joined:
340 for (
int d = 0; d < Dimensions; d++) {
352 and rhs.getRefinementControl() == GridControlEvent::RefinementControl::Erase)
353 or (lhs.
getRefinementControl() == GridControlEvent::RefinementControl::Refine and rhs.getRefinementControl() == GridControlEvent::RefinementControl::Refine);
374 - boundingEventOffset;
390 - boundingEventOffset;
391 return GridControlEvent(rhs.getRefinementControl(), boundingEventOffset, boundingEventSize, rhs.getH());
396 std::vector<GridControlEvent> localEvents = events;
397 int localSize = events.size();
400 logDebug(
"reduceGridControlEvents(...)",
"feed local data of size " << localEvents.size() <<
" into allgather");
406 totalSize += sizes[i];
408 events.resize(totalSize);
410 "reduceGridControlEvents(...)",
412 << totalSize <<
" grid control event(s) over all ranks, while the local rank hosts " << events.size()
419 for (
int j = 0; j < sizes[i]; j++) {
420 events[offset + j] = localEvents[j];
426 events.data() + offset,
428 GridControlEvent::getGlobalCommunciationDatatype(),
#define assertion1(expr, param)
std::ostream & operator<<(std::ostream &out, const peano4::datamanagement::CellMarker &marker)
#define logDebug(methodName, logMacroMessageStream)
#define logTraceOutWith1Argument(methodName, argument0)
#define logTraceInWith1Argument(methodName, argument0)
#define dfor2(counter)
Shortcut For dfor(counter,2)
#define enddforx
I prefer to use this macro for dforx instead of a closing bracket as many syntax parser fail otherwis...
int getNumberOfRanks() const
static Rank & getInstance()
This operation returns the singleton instance.
int getRank() const
Return rank of this node.
MPI_Comm getCommunicator() const
std::string toString(Filter filter)
tarch::logging::Log _log("exahype2::fv")
peano4::grid::GridStatistics operator+(peano4::grid::GridStatistics lhs, peano4::grid::GridStatistics rhs)
bool twoEventsAreAdjacent(const peano4::grid::GridControlEvent &lhs, const peano4::grid::GridControlEvent &rhs, double Tolerance)
Are two events adjacent.
void mergeAdjacentRefinementEvents(std::list< peano4::grid::GridControlEvent > &inputEvents, int Tolerance)
Merge adjacent events.
void removeEraseEventsThatAreCancelledByRefineEvents(const std::list< peano4::grid::GridControlEvent > &refineEvents, std::list< peano4::grid::GridControlEvent > &eraseEvents)
This is the first thing I do.
bool refinementEventOverrulesCoarsening(const peano4::grid::GridControlEvent &refineEvent, const peano4::grid::GridControlEvent &eraseEvent)
A refinement event overrules the coarsening if.
peano4::grid::GridControlEvent createBoundingBoxEvent(const peano4::grid::GridControlEvent &lhs, const peano4::grid::GridControlEvent &rhs)
void sort(std::list< peano4::grid::GridControlEvent > &events)
Sort grid control events geometrically.
bool twoEventsOverlap(const peano4::grid::GridControlEvent &lhs, const peano4::grid::GridControlEvent &rhs)
Helper function which helps us throughout the merge.
bool equals(const peano4::grid::GridControlEvent &lhs, const peano4::grid::GridControlEvent &rhs)
bool isSpacetreeNodeRefined(GridVertex vertices[TwoPowerD])
A spacetree node is refined if any of its adjacent vertices holds one of the following flags:
std::string toString(VertexType type)
void clear(GridStatistics &statistics, bool isGlobalMasterTree)
The term clear() is not 100% correct, as the number of stationary traversals is not reset to a dummy ...
void reduceGridControlEvents(std::vector< GridControlEvent > &events)
Peano 4 does not reduce any grid control events globally.
GridVertex createVertex(GridVertex::State state, const tarch::la::Vector< Dimensions, double > &x, int level, const tarch::la::Vector< TwoPowerD, int > &adjacentRanks, bool isNewFineGridVertex)
Factory mechanism.
std::bitset< TwoPowerD > haveVerticesBeenRefined(GridVertex vertices[TwoPowerD])
bool overlaps(const tarch::la::Vector< Dimensions, double > &x, const GridControlEvent &event)
std::bitset< TwoPowerD > willVerticesBeRefined(GridVertex vertices[TwoPowerD])
A vertex is unrefined if it is hanging.
bool hasVertexBeenRefined(const GridVertex &vertex)
A vertex has been refined if it is (already) refined or is erasing or the erase has been triggered.
std::vector< GridControlEvent > merge(std::vector< GridControlEvent > events, const double Tolerance=0.1)
Merge set of refinement/coarsening commands.
bool willVertexBeRefined(const GridVertex &vertex)
A vertex will be refined if it is already refined or currently refining.
bool isContained(const AutomatonState &x, const GridControlEvent &event, double upscaleAutomatonState=1.0)
isContained() is defined over the closed interval, i.e.
Scalar volume(const Vector< Size, Scalar > &vector)
Computes the volume of the tetrahedron spanned by the Cartesian unit vectors scaled by the correspond...
bool allGreaterEquals(const Vector< Size, Scalar > &lhs, const Scalar &cmp, const Scalar tolerance=NUMERICAL_ZERO_DIFFERENCE)
static bool smaller(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE) InlineMethod
Smaller operator for floating point values.
bool greater(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE)
bool oneSmallerEquals(const Vector< Size, Scalar > &lhs, const Scalar &cmp, const Scalar tolerance=NUMERICAL_ZERO_DIFFERENCE)
double relativeEps(double valueA, double valueB=std::numeric_limits< double >::min(), double eps=NUMERICAL_ZERO_DIFFERENCE)
Determine a relative tolerance from one or two values.
double max(double a, double b, double c)
I need the maximum of three values all the time, to I decided to write a function for this.
bool smallerEquals(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE)
bool allSmallerEquals(const Vector< Size, Scalar > &lhs, const Scalar &cmp, const Scalar tolerance=NUMERICAL_ZERO_DIFFERENCE)
bool equals(const Matrix< Rows, Cols, Scalar > &lhs, const Matrix< Rows, Cols, Scalar > &rhs, const Scalar &tolerance=NUMERICAL_ZERO_DIFFERENCE)
Compares to matrices on equality by means of a numerical accuracy.
Scalar min(const Vector< Size, Scalar > &vector)
Returns the element with minimal value (NOT absolute value).
static std::string toString(Mode mode)
std::string toString() const
tarch::la::Vector< Dimensions, double > getWidth() const
peano4::grid::GridControlEvent::RefinementControl getRefinementControl() const
tarch::la::Vector< Dimensions, double > getOffset() const
std::string toString() const
tarch::la::Vector< Dimensions, double > getH() const
void setNumberOfLocalRefinedCells(int value)
int getNumberOfLocalRefinedCells() const
void setNumberOfRemoteUnrefinedCells(int value)
void setMinH(const tarch::la::Vector< Dimensions, double > &value)
int getNumberOfLocalUnrefinedCells() const
void setCoarseningHasBeenVetoed(bool value)
void setStationarySweeps(int value)
int getStationarySweeps() const
bool getRemovedEmptySubtree() const
void setNumberOfLocalUnrefinedCells(int value)
void setNumberOfRemoteRefinedCells(int value)
int getNumberOfRemoteRefinedCells() const
int getNumberOfRemoteUnrefinedCells() const
bool getCoarseningHasBeenVetoed() const
tarch::la::Vector< Dimensions, double > getMinH() const
void setRemovedEmptySubtree(bool value)
void setBackupOfAdjacentRanks(const tarch::la::Vector< TwoPowerD, int > &value)
void setIsAntecessorOfRefinedVertexInCurrentTreeSweep(bool value)
void setNumberOfAdjacentRefinedLocalCells(int value)
void setIsParentOfSubtreeVertexInCurrentTreeSweep(bool value)
void setHasBeenParentOfSubtreeVertexInPreviousTreeSweep(bool value)
void setHasBeenAntecessorOfRefinedVertexInPreviousTreeSweep(bool value)
void setState(State value)
void setAdjacentRanks(const tarch::la::Vector< TwoPowerD, int > &value)
peano4::grid::GridVertex::State getState() const