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(
"::")}};
56 static bool gridCreated =
false;
57 static int solverSteps;
58 bool continueToSolve =
true;
59 static bool plotThenExit =
false;
60 const int MaxIterations = {{MAXITERATIONS}};
64 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
67 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
70 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution )
75 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
78 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
83{%
if PlotEachTimeStep %}
85 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
89 ++solverSteps >= MaxIterations
91 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
92 ) plotThenExit =
true;
95 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
100 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
103 continueToSolve =
false;
104 logInfo(
"selectNextAlgorithmicStep()",
"terminating after " << solverSteps <<
" steps");
109 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
115 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
118 ++solverSteps >= MaxIterations
120 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
125 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
131 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
136 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
138 if ( plotThenExit ) {
139 logInfo(
"selectNextAlgorithmicStep()",
"terminating after " << solverSteps <<
" sweeps");
140 continueToSolve =
false;
144 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
150 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
159 std::numeric_limits<double>::max()
161 static int globalNumberOfTrees = 0;
164 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep({{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid)
169 "selectNextAlgorithmicStep()",
"mesh has been stationary for more than 5 grid sweeps. Stop grid construction"
174 return continueToSolve;
179 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
186 logInfo(
"step()",
"run " << {{SUBNAMESPACE}}repositories::StepRepository::toString(stepName));
190 static int creepingNumberOfLocalCells = 0;
192 switch ( stepName ) {
193 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
197 observers::CreateGrid observer;
198 observers::CreateGrid::prepareTraversal();
202 observers::CreateGrid::unprepareTraversal();
207 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
211 observers::InitSolution observer;
212 observers::InitSolution::prepareTraversal();
216 observers::InitSolution::unprepareTraversal();
221 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
225 observers::Solve observer;
226 observers::Solve::prepareTraversal();
228 {{SUBNAMESPACE}}repositories::beginMeshSweep();
230 {{SUBNAMESPACE}}repositories::endMeshSweep();
232 observers::Solve::unprepareTraversal();
238 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
242 observers::Plot observer;
243 observers::Plot::prepareTraversal();
247 observers::Plot::unprepareTraversal();
251 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
259int main(
int argc,
char** argv) {
260 const int ExitCodeSuccess = 0;
261 const int ExitCodeUnitTestsFailed = 1;
262 const int ExitCodeInvalidArguments = 2;
263 const int ExitCodeInvalidBuild = 3;
275 logError(
"main()",
"MPI runs without multithreading are not supported currently.");
276 return ExitCodeInvalidBuild;
281 "main()",
"no multigrid.log-filter file found or file has been corrupted. Use default logging configuration"
285 {{SUBNAMESPACE}}repositories::DataRepository::initDatatypes();
287 {%
if FENV_ARGS is defined and FENV_ARGS !=
"" -%}
288 feenableexcept({{FENV_ARGS}} );
298 logError(
"main()",
"unit tests failed. Quit.");
308#if defined(SharedOMP)
315#if defined(UseSmartMPI)
323 if (isGlobalMaster) {
328 logInfo(
"main()",
"terminated successfully");
349 }
else if (isPeanoComputeNode) {
354#if defined(UseSmartMPI)
356 while (smartmpi::continueToRun()) {
362#if defined(SharedOMP)
373 {{SUBNAMESPACE}}repositories::DataRepository::shutdownDatatypes();
377 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