3#include "SpacetreeSet-main.h"
8#include "peano4/parallel/SpacetreeSet.h"
9#include "peano4/peano4.h"
10#include "tarch/logging/Log.h"
11#include "tarch/logging/LogFilter.h"
12#include "tarch/mpi/Rank.h"
13#include "tarch/timing/Watch.h"
14#include "toolbox/loadbalancing/LoadBalancer.h"
22 tarch::logging::Log
_log(
"");
24 constexpr int CreateGridWithRefinement = 0;
25 constexpr int CreateGridWithoutRefinement = 1;
26 constexpr int EmptyTraversal = 2;
28 static toolbox::loadbalancing::LoadBalancer loadBalancer;
30 static tarch::timing::Watch watch(
"::",
"",
false);
32 void setupEnvironment(
int argc,
char** argv) {
34 const auto DomainOffset = {0.0, 0.0};
35 const auto DomainSize = {1.0, 1.0};
37 const auto DomainOffset = {0.0, 0.0, 0.0};
38 const auto DomainSize = {1.0, 1.0, 1.0};
41 tarch::logging::LogFilter::getInstance().addFilterListEntry(
42 tarch::logging::LogFilter::FilterListEntry(
43 tarch::logging::LogFilter::FilterListEntry::TargetDebug,
44 tarch::logging::LogFilter::FilterListEntry::AnyRank,
46 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
47 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
50 tarch::logging::LogFilter::getInstance().addFilterListEntry(
51 tarch::logging::LogFilter::FilterListEntry(
52 tarch::logging::LogFilter::FilterListEntry::TargetTrace,
53 tarch::logging::LogFilter::FilterListEntry::AnyRank,
55 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
56 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
59 tarch::logging::LogFilter::getInstance().addFilterListEntry(
60 tarch::logging::LogFilter::FilterListEntry(
61 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
62 tarch::logging::LogFilter::FilterListEntry::AnyRank,
64 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
65 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
68 tarch::logging::LogFilter::getInstance().addFilterListEntry(
69 tarch::logging::LogFilter::FilterListEntry(
70 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
73 tarch::logging::LogFilter::FilterListEntry::WhiteListEntry,
74 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
78 tarch::logging::LogFilter::getInstance().addFilterListEntry(
79 tarch::logging::LogFilter::FilterListEntry(
80 tarch::logging::LogFilter::FilterListEntry::TargetDebug,
81 tarch::logging::LogFilter::FilterListEntry::AnyRank,
83 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
84 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
87 tarch::logging::LogFilter::getInstance().addFilterListEntry(
88 tarch::logging::LogFilter::FilterListEntry(
89 tarch::logging::LogFilter::FilterListEntry::TargetTrace,
90 tarch::logging::LogFilter::FilterListEntry::AnyRank,
92 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
93 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
96 tarch::logging::LogFilter::getInstance().addFilterListEntry(
97 tarch::logging::LogFilter::FilterListEntry(
98 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
99 tarch::logging::LogFilter::FilterListEntry::AnyRank,
101 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
102 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
105 tarch::logging::LogFilter::getInstance().addFilterListEntry(
106 tarch::logging::LogFilter::FilterListEntry(
107 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
110 tarch::logging::LogFilter::FilterListEntry::WhiteListEntry,
111 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
115 tarch::logging::LogFilter::getInstance().addFilterListEntry(
116 tarch::logging::LogFilter::FilterListEntry(
117 tarch::logging::LogFilter::FilterListEntry::TargetDebug,
118 tarch::logging::LogFilter::FilterListEntry::AnyRank,
120 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
121 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
124 tarch::logging::LogFilter::getInstance().addFilterListEntry(
125 tarch::logging::LogFilter::FilterListEntry(
126 tarch::logging::LogFilter::FilterListEntry::TargetTrace,
127 tarch::logging::LogFilter::FilterListEntry::AnyRank,
129 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
130 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
133 tarch::logging::LogFilter::getInstance().addFilterListEntry(
134 tarch::logging::LogFilter::FilterListEntry(
135 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
136 tarch::logging::LogFilter::FilterListEntry::AnyRank,
138 tarch::logging::LogFilter::FilterListEntry::BlackListEntry,
139 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
142 tarch::logging::LogFilter::getInstance().addFilterListEntry(
143 tarch::logging::LogFilter::FilterListEntry(
144 tarch::logging::LogFilter::FilterListEntry::TargetInfo,
147 tarch::logging::LogFilter::FilterListEntry::WhiteListEntry,
148 tarch::logging::LogFilter::FilterListEntry::AlwaysOn
152 peano4::init(&argc, &argv, DomainOffset, DomainSize, 0);
153 peano4::writeCopyrightMessage();
156 void shutdownEnvironment() { peano4::shutdown(); }
158 void logGridTraversalStatistics(
const char*
step,
double dt) {
159 if (tarch::mpi::Rank::getInstance().isGlobalMaster()) {
161 "logGridTraversalStatistics()",
163 <<
" traversal took " << std::fixed << std::setprecision(4) << dt <<
"s"
164 <<
": Leaves=" << loadBalancer.getStatistics().getGlobalNumberOfInnerUnrefinedCells()
165 <<
", Trees=" << loadBalancer.getStatistics().getGlobalNumberOfTrees()
170 void runNextAlgorithmicStep() {
171 const int currentStep = peano4::parallel::Node::getInstance().getCurrentProgramStep();
173 switch (currentStep) {
174 case CreateGridWithRefinement: {
175 tarch::logging::LogFilter::getInstance().switchProgramPhase(
"CreateGridWithRefinement");
178 peano4::parallel::SpacetreeSet::getInstance().traverse(createGridObserverWithRefinement);
180 loadBalancer.update();
181 logGridTraversalStatistics(
"CreateGrid", watch.getCalendarTime());
184 case CreateGridWithoutRefinement: {
185 tarch::logging::LogFilter::getInstance().switchProgramPhase(
"CreateGridWithoutRefinement");
188 peano4::parallel::SpacetreeSet::getInstance().traverse(createGridObserverWithoutRefinement);
190 loadBalancer.update();
191 logGridTraversalStatistics(
"CreateGrid", watch.getCalendarTime());
194 case EmptyTraversal: {
195 tarch::logging::LogFilter::getInstance().switchProgramPhase(
"EmptyTraversal");
198 peano4::parallel::SpacetreeSet::getInstance().traverse(emptyTraversalObserver);
200 loadBalancer.update();
201 logGridTraversalStatistics(
"Empty", watch.getCalendarTime());
211 static bool initialised =
false;
212 static bool gridConstructed =
false;
213 static double currentMinH = std::numeric_limits<double>::max();
214 static int currentGlobalNumberOfTrees = 0;
215 static int numberOfStationarySweeps = 0;
217 if (not initialised) {
218 peano4::parallel::Node::getInstance().setNextProgramStep(CreateGridWithRefinement);
224 if (gridConstructed and peano4::parallel::Node::getInstance().getCurrentProgramStep() == EmptyTraversal) {
229 if (gridConstructed) {
230 peano4::parallel::Node::getInstance().setNextProgramStep(EmptyTraversal);
235 assertion(loadBalancer.getStatistics().getGlobalNumberOfTrees() > 0);
237 const int currentProgramStep = peano4::parallel::Node::getInstance().getCurrentProgramStep();
239 if (tarch::la::smaller(loadBalancer.getStatistics().getGlobalMinH(), currentMinH)) {
240 currentMinH = loadBalancer.getStatistics().getGlobalMinH();
241 peano4::parallel::Node::getInstance().setNextProgramStep(CreateGridWithoutRefinement);
245 if (loadBalancer.getStatistics().getGlobalNumberOfTrees() > currentGlobalNumberOfTrees) {
246 currentGlobalNumberOfTrees = loadBalancer.getStatistics().getGlobalNumberOfTrees();
247 peano4::parallel::Node::getInstance().setNextProgramStep(CreateGridWithoutRefinement);
251 if (tarch::la::smallerEquals(currentMinH, MinH) and loadBalancer.isStagnating()
252 and currentProgramStep == CreateGridWithRefinement) {
254 if (loadBalancer.getStatistics().getGlobalNumberOfStationarySweeps() == 0
255 and numberOfStationarySweeps < loadBalancer.getNumberOfSettlingIterations()) {
257 "selectNextAlgorithmicStep()",
258 "Admissible mesh size reached, but at least one rank still has pending refinement events."
260 peano4::parallel::Node::getInstance().setNextProgramStep(CreateGridWithRefinement);
261 ++numberOfStationarySweeps;
266 "selectNextAlgorithmicStep()",
267 "Grid construction complete. Admissible mesh size reached (h_{min}="
268 << currentMinH <<
", admissible h_{min}=" << MinH <<
") and load balancing has converged."
271 gridConstructed =
true;
272 peano4::parallel::Node::getInstance().setNextProgramStep(EmptyTraversal);
276 peano4::parallel::Node::getInstance().setNextProgramStep(CreateGridWithRefinement);
280 int runGlobalMaster() {
282 peano4::parallel::Node::getInstance().continueToRun();
283 runNextAlgorithmicStep();
287 peano4::parallel::Node::getInstance().setNextProgramStep(peano4::parallel::Node::Terminate);
288 peano4::parallel::Node::getInstance().continueToRun();
294 while (peano4::parallel::Node::getInstance().continueToRun()) {
295 runNextAlgorithmicStep();
300int main(
int argc,
char** argv) {
301 setupEnvironment(argc, argv);
303 int result = EXIT_SUCCESS;
304 if (tarch::mpi::Rank::getInstance().isGlobalMaster()) {
305 result = runGlobalMaster();
310 shutdownEnvironment();
int main(int argc, char **argv)
bool selectNextAlgorithmicStep()
Decide which step to run next.
tarch::logging::Log _log("::")