69 static bool gridConstructed =
false;
70 static bool gridInitialised =
false;
71 static bool gridBalanced =
false;
72 static double nextMaxPlotTimeStamp = FirstPlotTimeStamp;
73 static double nextMinPlotTimeStamp = FirstPlotTimeStamp;
74 static double nextMaxCheckpointTimeStamp = FirstCheckpointTimeStamp;
75 static double nextMinCheckpointTimeStamp = FirstCheckpointTimeStamp;
76 static bool haveJustWrittenSnapshot =
false;
77 static bool haveReceivedNoncriticialAssertion =
false;
78 static bool addGridSweepWithoutGridRefinementNext =
false;
80 std::numeric_limits<double>::max()
82 static int globalNumberOfTrees = 0;
83 bool continueToSolve =
true;
87 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::PlotSolution)
89 haveReceivedNoncriticialAssertion =
true;
91 "selectNextAlgorithmicStep()",
"non-critical assertion has been triggered in code. Dump final state and terminate"
94 continueToSolve =
false;
95 }
else if (gridConstructed and not gridBalanced) {
96 if (not repositories::loadBalancer.isEnabled(
true) and not repositories::loadBalancer.hasSplitRecently()) {
97 logInfo(
"selectNextAlgorithmicStep()",
"all ranks have switched off their load balancing");
101 "selectNextAlgorithmicStep()",
"wait for load balancing to become stable: " << repositories::loadBalancer
106 repositories::StepRepository::Steps::CreateGridAndConvergeLoadBalancing
108 }
else if (gridBalanced and not gridInitialised) {
110 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::InitGrid)
113 gridInitialised =
true;
114 }
else if (not gridConstructed) {
118 "selectNextAlgorithmicStep()",
"mesh has refined, so reset minH=" << minH <<
" and postpone further refinement"
120 addGridSweepWithoutGridRefinementNext =
true;
121 }
else if (repositories::loadBalancer.getGlobalNumberOfTrees() > globalNumberOfTrees) {
122 logInfo(
"selectNextAlgorithmicStep()",
"mesh has rebalanced recently, so postpone further refinement)");
123 addGridSweepWithoutGridRefinementNext =
true;
124 globalNumberOfTrees = repositories::loadBalancer.getGlobalNumberOfTrees();
134 "selectNextAlgorithmicStep()",
"grid has been stationary for quite some time. Terminate grid construction"
136 addGridSweepWithoutGridRefinementNext =
false;
137 gridConstructed =
true;
140 "selectNextAlgorithmicStep()",
141 "mesh rebalancing seems to be stationary, so study whether to refine mesh further in next sweep: "
144 addGridSweepWithoutGridRefinementNext =
false;
145 globalNumberOfTrees = repositories::loadBalancer.getGlobalNumberOfTrees();
149 if (addGridSweepWithoutGridRefinementNext) {
151 repositories::StepRepository::Steps::CreateGridButPostponeRefinement
155 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::CreateGrid)
159 continueToSolve =
true;
161 if (TimeInBetweenPlots > 0.0 and repositories::getMinTimeStamp() < MinTerminalTime and repositories::getMaxTimeStamp() < MaxTerminalTime and (repositories::getMinTimeStamp() >= nextMinPlotTimeStamp or repositories::getMaxTimeStamp() >= nextMaxPlotTimeStamp) and repositories::mayPlot()) {
162 if (repositories::getMinTimeStamp() >= nextMinPlotTimeStamp) {
163 nextMinPlotTimeStamp += TimeInBetweenPlots;
165 if (repositories::getMaxTimeStamp() >= nextMaxPlotTimeStamp) {
166 nextMaxPlotTimeStamp += TimeInBetweenPlots;
169 if (nextMinPlotTimeStamp < repositories::getMinTimeStamp()) {
171 "selectNextAlgorithmicStep()",
172 "code is asked to plot every dt="
173 << TimeInBetweenPlots <<
", but this seems to be less than the time step size of the solvers. "
174 <<
"So postpone next plot to t=" << (repositories::getMinTimeStamp() + TimeInBetweenPlots)
176 nextMinPlotTimeStamp = repositories::getMinTimeStamp() + TimeInBetweenPlots;
177 }
else if (nextMaxPlotTimeStamp < repositories::getMaxTimeStamp()) {
179 "selectNextAlgorithmicStep()",
180 "code is asked to plot every dt="
181 << TimeInBetweenPlots <<
", but this seems to be less than the time step size of the solvers. "
182 <<
"So postpone next plot to t=" << (repositories::getMaxTimeStamp() + TimeInBetweenPlots)
184 nextMaxPlotTimeStamp = repositories::getMaxTimeStamp() + TimeInBetweenPlots;
187 nextMaxPlotTimeStamp = std::max(nextMaxPlotTimeStamp, nextMinPlotTimeStamp);
190 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::PlotSolution)
192 haveJustWrittenSnapshot =
true;
193 continueToSolve =
true;
194 }
else if (TimeInBetweenCheckpoints > 0.0 and repositories::getMinTimeStamp() < MinTerminalTime and repositories::getMaxTimeStamp() < MaxTerminalTime and (repositories::getMinTimeStamp() >= nextMinCheckpointTimeStamp or repositories::getMaxTimeStamp() >= nextMaxCheckpointTimeStamp) and repositories::mayPlot()) {
195 if (repositories::getMinTimeStamp() >= nextMinCheckpointTimeStamp) {
196 nextMinCheckpointTimeStamp += TimeInBetweenCheckpoints;
198 if (repositories::getMaxTimeStamp() >= nextMaxCheckpointTimeStamp) {
199 nextMaxCheckpointTimeStamp += TimeInBetweenCheckpoints;
202 if (nextMinCheckpointTimeStamp < repositories::getMinTimeStamp()) {
204 "selectNextAlgorithmicStep()",
205 "code is asked to Checkpoint every dt="
206 << TimeInBetweenCheckpoints <<
", but this seems to be less than the time step size of the solvers. "
207 <<
"So postpone next Checkpoint to t=" << (repositories::getMinTimeStamp() + TimeInBetweenCheckpoints)
209 nextMinCheckpointTimeStamp = repositories::getMinTimeStamp() + TimeInBetweenCheckpoints;
210 }
else if (nextMaxCheckpointTimeStamp < repositories::getMaxTimeStamp()) {
212 "selectNextAlgorithmicStep()",
213 "code is asked to Checkpoint every dt="
214 << TimeInBetweenCheckpoints <<
", but this seems to be less than the time step size of the solvers. "
215 <<
"So postpone next Checkpoint to t=" << (repositories::getMaxTimeStamp() + TimeInBetweenCheckpoints)
217 nextMaxCheckpointTimeStamp = repositories::getMaxTimeStamp() + TimeInBetweenCheckpoints;
220 nextMaxCheckpointTimeStamp = std::max(nextMaxCheckpointTimeStamp, nextMinCheckpointTimeStamp);
223 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::CheckpointSolution)
225 haveJustWrittenSnapshot =
true;
226 continueToSolve =
true;
227 }
else if (repositories::getMinTimeStamp() < MinTerminalTime and repositories::getMaxTimeStamp() < MaxTerminalTime) {
229 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::TimeStep)
231 continueToSolve =
true;
232 haveJustWrittenSnapshot =
false;
234 if (not haveJustWrittenSnapshot and TimeInBetweenPlots > 0.0 and repositories::mayPlot()) {
236 repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::PlotSolution)
238 continueToSolve =
true;
239 haveJustWrittenSnapshot =
true;
240 nextMinPlotTimeStamp = std::numeric_limits<double>::max();
241 nextMaxPlotTimeStamp = std::numeric_limits<double>::max();
242 }
else if (not haveJustWrittenSnapshot and TimeInBetweenPlots > 0.0 and not repositories::mayPlot()) {
243 continueToSolve =
true;
245 continueToSolve =
false;
250 return continueToSolve;
256 auto stepName = repositories::StepRepository::toStepEnum(stepIdentifier);
263 logInfo(
"step()",
"Starting AlgorithmicStep [" << repositories::StepRepository::toString(stepName)<<
"]" );
267 static int creepingNumberOfLocalCells = 0;
270 case repositories::StepRepository::Steps::CreateGridButPostponeRefinement: {
275 repositories::startGridConstructionStep();
280 observers::CreateGridButPostponeRefinement observer;
290 repositories::finishGridConstructionStep();
292 case repositories::StepRepository::Steps::CreateGrid: {
297 repositories::startGridConstructionStep();
302 observers::CreateGrid observer;
312 repositories::finishGridConstructionStep();
319 case repositories::StepRepository::Steps::CreateGridAndConvergeLoadBalancing: {
323 "it seems the grid has just refined before we switched to the phase where we make the load balancing converge. Wait for a few iterations more to give load balancing chance to catch up"
335 logInfo(
"step()",
"rank is degenerated so disable load balancing temporarily");
336 repositories::loadBalancer.enable(
false);
341 repositories::loadBalancer.isEnabled(
false)
345 "grid construction and decomposition on this rank seem to be stable as we have around "
346 << creepingNumberOfLocalCells <<
" local cells in the heaviest tree. Disable load balancing temporarily"
348 repositories::loadBalancer.enable(
false);
351 repositories::startGridConstructionStep();
356 observers::CreateGridButPostponeRefinement observer;
366 repositories::finishGridConstructionStep();
371 not repositories::loadBalancer.hasSplitRecently()
373 repositories::loadBalancer.isEnabled(
false)
377 "have to decrement local cell counter "
378 << creepingNumberOfLocalCells <<
" as maximum weight is "
381 creepingNumberOfLocalCells = (creepingNumberOfLocalCells
386 case repositories::StepRepository::Steps::InitGrid: {
388 repositories::loadBalancer.enable(
false);
392 repositories::startGridInitialisationStep();
397 observers::InitGrid observer;
398 observers::InitGrid::prepareTraversal();
402 observers::InitGrid::unprepareTraversal();
409 repositories::finishGridInitialisationStep();
411 case repositories::StepRepository::Steps::PlotSolution: {
413 const double minTimeStamp = repositories::getMinTimeStamp();
414 const double maxTimeStamp = repositories::getMaxTimeStamp();
415 const double minTimeStepSize = repositories::getMinTimeStepSize();
416 const double maxTimeStepSize = repositories::getMaxTimeStepSize();
420 repositories::startPlottingStep(minTimeStamp, maxTimeStamp, minTimeStepSize, maxTimeStepSize);
425 observers::PlotSolution observer;
426 observers::PlotSolution::prepareTraversal();
430 observers::PlotSolution::unprepareTraversal();
437 repositories::finishPlottingStep();
439 case repositories::StepRepository::Steps::CheckpointSolution: {
441 const double minTimeStamp = repositories::getMinTimeStamp();
442 const double maxTimeStamp = repositories::getMaxTimeStamp();
443 const double minTimeStepSize = repositories::getMinTimeStepSize();
444 const double maxTimeStepSize = repositories::getMaxTimeStepSize();
448 repositories::startPlottingStep(minTimeStamp, maxTimeStamp, minTimeStepSize, maxTimeStepSize);
453 observers::CheckpointSolution observer;
454 observers::CheckpointSolution::prepareTraversal();
458 observers::CheckpointSolution::unprepareTraversal();
465 repositories::finishPlottingStep();
467 case repositories::StepRepository::Steps::TimeStep: {
469 if (repositories::loadBalancer.isEnabled(
false)) {
470 logInfo(
"step()",
"disable load balancing throughout initialisation (to be removed in later releases)");
471 repositories::loadBalancer.enable(
false);
474 const double minTimeStamp = repositories::getMinTimeStamp();
475 const double maxTimeStamp = repositories::getMaxTimeStamp();
476 const double minTimeStepSize = repositories::getMinTimeStepSize();
477 const double maxTimeStepSize = repositories::getMaxTimeStepSize();
478 const double minMeshSize = repositories::getMinMeshSize();
479 const double maxMeshSize = repositories::getMaxMeshSize();
484 repositories::startTimeStep(minTimeStamp, maxTimeStamp, minTimeStepSize, maxTimeStepSize);
489 observers::TimeStep observer;
490 observers::TimeStep::prepareTraversal();
494 observers::TimeStep::unprepareTraversal();
501 repositories::finishTimeStep();
504 #if defined(USE_ADDITIONAL_MESH_TRAVERSAL)
505 case repositories::StepRepository::Steps::AdditionalMeshTraversal:
509 repositories::suspendSolversForOneGridSweep();
510 observers::AdditionalMeshTraversal observer;
511 observers::AdditionalMeshTraversal::prepareTraversal();
513 observers::AdditionalMeshTraversal::unprepareTraversal();
518 case repositories::StepRepository::Steps::Undef:
527 logInfo(
"step()",
"Finishing [" << repositories::StepRepository::toString(stepName) <<
"] Current SolverState [" << AbstractCCZ4::toString(repositories::instanceOfCCZ4.getSolverState())<<
"]" );
tarch::timing::Measurement gridConstructionMeasurement
tarch::timing::Measurement timePerMeshSweepMeasurement
tarch::logging::Log _log("::")
tarch::timing::Measurement timeStepMeasurement
bool selectNextAlgorithmicStep()
Decide which step to run next.
tarch::timing::Measurement plotMeasurement