1#include "{{MAIN_NAME}}.h"
8#include "{{SUBDIRECTORY}}observers/CreateGrid.h"
9#include "{{SUBDIRECTORY}}observers/InitSolution.h"
10#include "{{SUBDIRECTORY}}observers/Solve.h"
11#include "{{SUBDIRECTORY}}observers/Plot.h"
12{%
if SUBDIRECTORIES -%}
13{%
for subdirectory in SUBDIRECTORIES %}
14#include "{{subdirectory}}repositories/DataRepository.h"
15#include "{{subdirectory}}repositories/StepRepository.h"
16#include "{{subdirectory}}repositories/SolverRepository.h"
19#include "repositories/DataRepository.h"
20#include "repositories/StepRepository.h"
21#include "repositories/SolverRepository.h"
38{%
if FENV_ARGS is defined and FENV_ARGS !=
"" -%}
40#pragma float_control(precise, on)
41#pragma STDC FENV_ACCESS ON
44using namespace {{NAMESPACE | join(
"::")}};
60 static bool gridCreated =
false;
61 static bool gridInitialised =
false;
62 static bool gridBalanced =
false;
64 static int solverSteps;
65 bool continueToSolve =
true;
67 std::numeric_limits<double>::max()
69 static int globalNumberOfTrees = repositories::loadBalancer.getGlobalNumberOfTrees();
71 static bool plotThenExit =
false;
72 const int MaxIterations = {{MAXITERATIONS}};
76 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
79 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
82 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution )
87 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
90 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
95{%
if PlotEachTimeStep %}
97 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
101 ++solverSteps >= MaxIterations
103 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
104 ) plotThenExit =
true;
107 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
112 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
115 continueToSolve =
false;
116 logInfo(
"selectNextAlgorithmicStep()",
"terminating after " << solverSteps <<
" steps");
121 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
127 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
130 ++solverSteps >= MaxIterations
132 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
135 logInfo(
"selectNextAlgorithmicStep()",
"terminating after " << solverSteps <<
" steps");
138 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
144 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
149 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
151 if ( plotThenExit ) {
152 logInfo(
"selectNextAlgorithmicStep()",
"terminating after " << solverSteps <<
" sweeps");
153 continueToSolve =
false;
157 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
163 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
173 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep({{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid)
178 "selectNextAlgorithmicStep()",
"mesh has been stationary for more than 5 grid sweeps. Stop grid construction"
183 return continueToSolve;
188 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
195 logInfo(
"step()",
"run " << {{SUBNAMESPACE}}repositories::StepRepository::toString(stepName));
199 static int creepingNumberOfLocalCells = 0;
201 switch ( stepName ) {
202 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
206 observers::CreateGrid observer;
207 observers::CreateGrid::prepareTraversal();
211 observers::CreateGrid::unprepareTraversal();
214 repositories::endCreateGrid();
218 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
222 observers::InitSolution observer;
223 observers::InitSolution::prepareTraversal();
227 observers::InitSolution::unprepareTraversal();
232 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
236 observers::Solve observer;
237 observers::Solve::prepareTraversal();
239 {{SUBNAMESPACE}}repositories::beginMeshSweep();
241 {{SUBNAMESPACE}}repositories::endMeshSweep();
243 observers::Solve::unprepareTraversal();
249 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
253 repositories::incrementPlotCounter();
255 observers::Plot observer;
256 observers::Plot::prepareTraversal();
260 observers::Plot::unprepareTraversal();
264 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
272int main(
int argc,
char** argv) {
273 const int ExitCodeSuccess = 0;
274 const int ExitCodeUnitTestsFailed = 1;
275 const int ExitCodeInvalidArguments = 2;
276 const int ExitCodeInvalidBuild = 3;
288 logError(
"main()",
"MPI runs without multithreading are not supported currently.");
289 return ExitCodeInvalidBuild;
294 "main()",
"no mghype.log-filter file found or file has been corrupted. Use default logging configuration"
298 {{SUBNAMESPACE}}repositories::DataRepository::initDatatypes();
300 {%
if FENV_ARGS is defined and FENV_ARGS !=
"" -%}
301 feenableexcept({{FENV_ARGS}} );
311 logError(
"main()",
"unit tests failed. Quit.");
321#if defined(SharedOMP)
328#if defined(UseSmartMPI)
336 if (isGlobalMaster) {
341 logInfo(
"main()",
"terminated successfully");
362 }
else if (isPeanoComputeNode) {
367#if defined(UseSmartMPI)
369 while (smartmpi::continueToRun()) {
375#if defined(SharedOMP)
386 {{SUBNAMESPACE}}repositories::DataRepository::shutdownDatatypes();
390 return ExitCodeSuccess;
#define assertionMsg(expr, message)
#define logError(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
#define logWarning(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
#define logInfo(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
tarch::timing::Measurement createGridMeasurement
tarch::logging::Log _log("::")
bool selectNextAlgorithmicStep()
tarch::timing::Measurement solveMeasurement
tarch::timing::Measurement initMeasurement
tarch::timing::Measurement plotMeasurement
int getCurrentProgramStep() const
void setNextProgramStep(int number)
The user tells the set which program step to use, i.e.
static Node & getInstance()
This operation returns the singleton instance.
peano4::grid::GridStatistics getGridStatistics() const
Return statistics object for primary spacetree.
static SpacetreeSet & getInstance()
void traverse(peano4::grid::TraversalObserver &observer)
Invoke traverse on all spacetrees in parallel.
static bool parsePlainTextFile(const std::string &filename)
Tries to parse a simple text file where each line contains an entry.
void switchProgramPhase(const std::string &activeProgramPhase)
static LogFilter & getInstance()
void writeToCSV(std::string filename="statistics")
Write data to csv file.
static Statistics & getInstance()
This is not the canonical realisation of singletons as I use it usually for stats in Peano.
bool isGlobalMaster() const
Is this node the global master process, i.e.
static Rank & getInstance()
This operation returns the singleton instance.
static void abort(int errorCode)
A proper abort in an MPI context has to use MPI_Abort.
static Core & getInstance()
int getNumberOfErrors() const
void addTestCase(const std::string &fullQualifiedPath, TestCase *testCase)
Adds a new test case.
virtual void run()
Runs all test cases assigned.
double getAccumulatedValue() const
std::string toString() const
void setValue(const double &value)
Set the value.
A simple class that has to be included to measure the clock ticks required for an operation.
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
void shutdownSingletons()
The very first thing I have to do is to shut down Node.
void fillLookupTables()
Fill Lookup Tables.
int initParallelEnvironment(int *argc, char ***argv)
Init Parallel Environment.
void initSingletons(const tarch::la::Vector< Dimensions, double > &offset, const tarch::la::Vector< Dimensions, double > &width, const std::bitset< Dimensions > &periodicBC=0)
Fire up all the singletons.
void shutdownParallelEnvironment()
Shutdown all the parallel environment, i.e.
void initSmartMPI()
Switch on SmartMPI.
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
#define OTTER_INITIALISE()
int getStationarySweeps() const