Peano
Loading...
Searching...
No Matches
MatrixFreeMain.template.cpp
Go to the documentation of this file.
1#include "{{MAIN_NAME}}.h"
2
3#include "peano4/peano.h"
4#include "peano4/UnitTests.h"
7
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"
17{% endfor -%}
18{% else %}
19#include "repositories/DataRepository.h"
20#include "repositories/StepRepository.h"
21#include "repositories/SolverRepository.h"
22{%- endif %}
23
24#include "tarch/UnitTests.h"
25#include "tarch/logging/Log.h"
34#include "tarch/timing/Watch.h"
37
38{% if FENV_ARGS is defined and FENV_ARGS != "" -%}
39#include <fenv.h>
40#pragma float_control(precise, on)
41#pragma STDC FENV_ACCESS ON
42{% endif -%}
43
44using namespace {{NAMESPACE | join("::")}};
45
46
48
53
54
56 static bool gridCreated = false;
57 static int solverSteps;
58 bool continueToSolve = true;
59 static bool plotThenExit = false;
60 const int MaxIterations = {{MAXITERATIONS}};
61
62 if (gridCreated){
64 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
65
66 switch ( stepName ) {
67 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
68 {
70 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution )
71 );
72 }
73 break;
74
75 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
76 {
78 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
79 );
80 }
81 break;
82
83{% if PlotEachTimeStep %}
84
85 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
86 {
87 {
88 if (
89 ++solverSteps >= MaxIterations
90 or
91 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
92 ) plotThenExit = true;
93
95 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
96 );
97 }
98 } break;
99
100 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
101 {
102 if (plotThenExit) {
103 continueToSolve = false;
104 logInfo("selectNextAlgorithmicStep()", "terminating after " << solverSteps << " steps");
105 }
106
107 else
109 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
110 );
111 } break;
112
113{% else %}
114
115 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
116 {
117 if (
118 ++solverSteps >= MaxIterations
119 or
120 {{SUBNAMESPACE}}repositories::terminationCriterionHolds()
121 )
122 {
123 plotThenExit = true;
125 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot )
126 );
127 }
128 else
129 {
131 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
132 );
133 }
134 }
135 break;
136 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
137 {
138 if ( plotThenExit ) {
139 logInfo("selectNextAlgorithmicStep()", "terminating after " << solverSteps << " sweeps");
140 continueToSolve = false;
141 }
142 else
144 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep( {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve )
145 );
146 }
147 break;
148
149{% endif %}
150 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
151 {
152 assertionMsg(false, "should not be called" );
153 }
154 break;
155 }
156 }
157 else {
159 std::numeric_limits<double>::max()
160 );
161 static int globalNumberOfTrees = 0;
162
164 {{SUBNAMESPACE}}repositories::StepRepository::toProgramStep({{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid)
165 );
166
168 logInfo(
169 "selectNextAlgorithmicStep()", "mesh has been stationary for more than 5 grid sweeps. Stop grid construction"
170 );
171 gridCreated = true;
172 }
173 }
174 return continueToSolve;
175}
176
177void step() {
179 auto stepName = {{SUBNAMESPACE}}repositories::StepRepository::toStepEnum(stepIdentifier);
180
181 static tarch::logging::Log _log("");
182#if PeanoDebug > 0
183#else
184 if (tarch::mpi::Rank::getInstance().isGlobalMaster())
185#endif
186 logInfo("step()", "run " << {{SUBNAMESPACE}}repositories::StepRepository::toString(stepName));
187
188 static tarch::timing::Watch watch("::", "step()", false);
189
190 static int creepingNumberOfLocalCells = 0;
191
192 switch ( stepName ) {
193 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::CreateGrid:
194 {
196
197 observers::CreateGrid observer;
198 observers::CreateGrid::prepareTraversal();
199 watch.start();
201 watch.stop();
202 observers::CreateGrid::unprepareTraversal();
203 createGridMeasurement.setValue( watch.getCalendarTime() );
204 }
205 break;
206
207 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::InitSolution:
208 {
210
211 observers::InitSolution observer;
212 observers::InitSolution::prepareTraversal();
213 watch.start();
215 watch.stop();
216 observers::InitSolution::unprepareTraversal();
217 initMeasurement.setValue( watch.getCalendarTime() );
218 }
219 break;
220
221 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Solve:
222 {
224
225 observers::Solve observer;
226 observers::Solve::prepareTraversal();
227 watch.start();
228 {{SUBNAMESPACE}}repositories::beginMeshSweep();
230 {{SUBNAMESPACE}}repositories::endMeshSweep();
231 watch.stop();
232 observers::Solve::unprepareTraversal();
233
234 solveMeasurement.setValue( watch.getCalendarTime() );
235 }
236 break;
237
238 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Plot:
239 {
241
242 observers::Plot observer;
243 observers::Plot::prepareTraversal();
244 watch.start();
246 watch.stop();
247 observers::Plot::unprepareTraversal();
248 plotMeasurement.setValue( watch.getCalendarTime() );
249 }
250 break;
251 case {{SUBNAMESPACE}}repositories::StepRepository::Steps::Undef:
252 assertion(false);
253 break;
254 }
255}
256
257
258
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;
264
268
269 tarch::la::Vector<Dimensions, double> x = {{DomainOffset}};
270 tarch::la::Vector<Dimensions, double> h = {{DomainSize}};
271
273
274 if (tarch::mpi::Rank::getInstance().getNumberOfRanks() > 1 and tarch::multicore::Core::getInstance().getNumberOfThreads() <= 1) {
275 logError("main()", "MPI runs without multithreading are not supported currently.");
276 return ExitCodeInvalidBuild;
277 }
278
279 if (not tarch::logging::LogFilterFileReader::parsePlainTextFile("mghype.log-filter")) {
281 "main()", "no multigrid.log-filter file found or file has been corrupted. Use default logging configuration"
282 );
283 }
284
285 {{SUBNAMESPACE}}repositories::DataRepository::initDatatypes();
286
287 {% if FENV_ARGS is defined and FENV_ARGS != "" -%}
288 feenableexcept({{FENV_ARGS}} );
289 {% endif -%}
290
291#if PeanoDebug >= 2
293 unitTests->addTestCase(peano4::getUnitTests());
294 unitTests->addTestCase(tarch::getUnitTests());
296 unitTests->run();
297 if (unitTests->getNumberOfErrors() != 0) {
298 logError("main()", "unit tests failed. Quit.");
299 tarch::mpi::Rank::abort(ExitCodeUnitTestsFailed);
300 }
301 delete unitTests;
302#endif
303
305
307
308#if defined(SharedOMP)
309#pragma omp parallel
310 {
311#pragma omp master
312 {
313#endif
314
315#if defined(UseSmartMPI)
316 const bool isGlobalMaster = tarch::mpi::Rank::getInstance().isGlobalMaster() and smartmpi::isComputeRank();
317 const bool isPeanoComputeNode = not tarch::mpi::Rank::getInstance().isGlobalMaster() and smartmpi::isComputeRank();
318#else
319 const bool isGlobalMaster = tarch::mpi::Rank::getInstance().isGlobalMaster();
320 const bool isPeanoComputeNode = not tarch::mpi::Rank::getInstance().isGlobalMaster();
321#endif
322
323 if (isGlobalMaster) {
324 while (selectNextAlgorithmicStep()) {
325 step();
326 }
327
328 logInfo("main()", "terminated successfully");
329 logInfo(
330 "main()",
331 "grid construction: " << createGridMeasurement.getAccumulatedValue(
332 ) << "s\t" << createGridMeasurement.toString()
333 );
334 logInfo(
335 "main()",
337 ) << "s\t" << initMeasurement.toString()
338 );
339 logInfo(
340 "main()",
342 ) << "s\t" << solveMeasurement.toString()
343 );
344 logInfo(
345 "main()",
346 "plotting: " << plotMeasurement.getAccumulatedValue(
347 ) << "s\t" << plotMeasurement.toString()
348 );
349 } else if (isPeanoComputeNode) {
350 while (peano4::parallel::Node::getInstance().continueToRun()) {
351 step();
352 }
353 }
354#if defined(UseSmartMPI)
355 else {
356 while (smartmpi::continueToRun()) {
357 smartmpi::tick();
358 }
359 }
360#endif
361
362#if defined(SharedOMP)
363 }
364 }
365#endif
366
368
370
371
373 {{SUBNAMESPACE}}repositories::DataRepository::shutdownDatatypes();
376
377 return ExitCodeSuccess;
378}
379
#define assertionMsg(expr, message)
#define assertion(expr)
#define logError(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
Definition Log.h:464
#define logWarning(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
Definition Log.h:440
#define logInfo(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
Definition Log.h:411
tarch::timing::Measurement createGridMeasurement
tarch::logging::Log _log("::")
bool selectNextAlgorithmicStep()
tarch::timing::Measurement solveMeasurement
tarch::timing::Measurement initMeasurement
tarch::timing::Measurement plotMeasurement
int main()
Definition main.cpp:321
int getCurrentProgramStep() const
Definition Node.cpp:447
void setNextProgramStep(int number)
The user tells the set which program step to use, i.e.
Definition Node.cpp:441
static Node & getInstance()
This operation returns the singleton instance.
Definition Node.cpp:108
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()
Log Device.
Definition Log.h:516
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.
Definition Rank.cpp:424
static Rank & getInstance()
This operation returns the singleton instance.
Definition Rank.cpp:543
static void abort(int errorCode)
A proper abort in an MPI context has to use MPI_Abort.
Definition Rank.cpp:596
static Core & getInstance()
Definition Core.cpp:56
int getNumberOfErrors() const
Definition TestCase.cpp:11
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.
Definition Watch.h:45
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:12
void shutdownSingletons()
The very first thing I have to do is to shut down Node.
Definition peano.cpp:150
void fillLookupTables()
Fill Lookup Tables.
Definition peano.cpp:87
int initParallelEnvironment(int *argc, char ***argv)
Init Parallel Environment.
Definition peano.cpp:101
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.
Definition peano.cpp:133
void shutdownParallelEnvironment()
Shutdown all the parallel environment, i.e.
Definition peano.cpp:127
void shutdownSmartMPI()
Definition multicore.cpp:49
void initSmartMPI()
Switch on SmartMPI.
Definition multicore.cpp:33
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:17
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:11
#define OTTER_FINALISE()
Definition otter.h:125
#define OTTER_INITIALISE()
Definition otter.h:124
Simple vector class.
Definition Vector.h:134