Peano
Loading...
Searching...
No Matches
SWIFTMain.template.cpp
Go to the documentation of this file.
1/* Template in python/swift2/output/SWIFTMain.template.cpp */
2
3#include "{{MAIN_NAME}}.h"
4#include "Constants.h"
5
7#include "tarch/logging/Log.h"
11
12#include "peano4/peano.h"
15
16#include "repositories/DataRepository.h"
17#include "repositories/StepRepository.h"
18#include "repositories/GlobalState.h"
19
20#include "peano4/UnitTests.h"
21#include "tarch/UnitTests.h"
22#include "swift2/UnitTests.h"
24
26
27#include "Constants.h"
28
30
31{% if FENV_ARGS is defined and FENV_ARGS != "" -%}
32#include <fenv.h>
33#pragma float_control(precise, on)
34#pragma STDC FENV_ACCESS ON
35{% endif -%}
36
37#include "observers/CreateGrid.h"
38#include "observers/InitialConditions.h"
39#include "observers/Plot.h"
40#include "observers/Cleanup.h"
41
42{% for STEP in SOLVERSTEP_NAMES %}
43#include "observers/{{STEP}}.h"
44{% endfor %}
45
46{% for STEP in INITIALISATIONSTEP_NAMES %}
47#include "observers/{{STEP}}.h"
48{% endfor %}
49
50
53
54
56
57
64
65
66bool {{NAMESPACE | join("::")}}::selectNextAlgorithmicStep() {
67 static bool gridConstructed = false;
68 static double nextMaxPlotTimeStamp = {{NAMESPACE | join("::")}}::FirstPlotTimeStamp;
69 static double nextMinPlotTimeStamp = {{NAMESPACE | join("::")}}::FirstPlotTimeStamp;
70 static tarch::la::Vector<Dimensions,double> minH = tarch::la::Vector<Dimensions,double>( std::numeric_limits<double>::max() );
71 bool continueToSolve = true;
72 static bool haveReceivedNoncriticialAssertion = false;
73
74 // ==============================================================
75 // Phase x: Generic types of steps for all phases:
76 // - Rerun previous sweep again;
77 // - Dump result due to non-critical assertion.
78 // ==============================================================
79 if (tarch::hasNonCriticalAssertionBeenViolated() and not haveReceivedNoncriticialAssertion) {
81 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::Plot )
82 );
83 haveReceivedNoncriticialAssertion = true;
85 "selectNextAlgorithmicStep()", "non-critical assertion has been triggered in code. Dump final state and terminate"
86 );
87 }
89 continueToSolve = false;
90 }
91 else if ( repositories::rerunPreviousGridSweep() ) {
92 logInfo(
93 "selectNextAlgorithmicStep()",
94 "rerun previous step " << repositories::StepRepository::toString(
95 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())
96 )
97 );
98 }
99 // ==============================
100 // Phase 1: Set up (initial) grid
101 // ==============================
102 else if (not gridConstructed) {
104 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::CreateGrid )
105 );
106
107 if (
108 tarch::la::max( peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getMinH() ) < GlobalMaxH
109 ) {
110 logInfo(
111 "selectNextAlgorithmicStep()",
112 "h_min=" << tarch::la::max( peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getMinH() ) <<
113 ", which his smaller than global h_max=" << GlobalMaxH <<
114 ". Continue with load balancing "
115 );
116 }
117 if (
118 peano4::parallel::SpacetreeSet::getInstance().getGridStatistics().getStationarySweeps()>5
119 ) {
120 logInfo(
121 "selectNextAlgorithmicStep()",
122 "mesh has been stationary for more than 5 grid sweeps. Stop grid construction"
123 );
124 gridConstructed = true;
125 }
126 }
127 // ==============================
128 // Phase 2: Insert the particles
129 // ==============================
130 else if (
131 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::CreateGrid
132 and
133 gridConstructed
134 and
135 not repositories::loadBalancer.hasSplitRecently()
136 ) {
138 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::InitialConditions )
139 );
140 }
141 else if (
142 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::CreateGrid
143 and
144 gridConstructed
145 and
146 repositories::loadBalancer.hasSplitRecently()
147 ) {
149 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::CreateGrid )
150 );
151 }
152 // ======================================================
153 // Phase 3: Run through the particle initialisation steps
154 // ======================================================
155 //
156 // Phase 3.a: Switch from initialisation (particle insertion) to first initialisation step
157 {% if INITIALISATIONSTEP_NAMES|length>0 %}
158 else if (
159 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::InitialConditions
160 ) {
162 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[0]}} )
163 );
164 }
165 {% endif %}
166 // Phase 3.b: Run through individual initialisation steps
167 {% for STEP_NUMBER in range(0,INITIALISATIONSTEP_NAMES|length-1) %}
168 else if (
169 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}}
170 ) {
172 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER+1]}} )
173 );
174 }
175 {% endfor %}
176 // Phase 3.c: If last step has finished and is not to be repeated, switch to
177 // time step or plot
178 else if (
179 {% if INITIALISATIONSTEP_NAMES|length>0 %}
180 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[-1]}}
181 {% else %}
182 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::InitialConditions
183 {% endif %}
184 and
185 TimeInBetweenPlots>0.0
186 ) {
187 logInfo(
188 "selectNextAlgorithmicStep()",
189 "plot initial condition"
190 );
192 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::Plot )
193 );
194 }
195 else if (
196 {% if INITIALISATIONSTEP_NAMES|length>0 %}
197 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[-1]}}
198 {% else %}
199 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::InitialConditions
200 {% endif %}
201 ) {
202 logInfo(
203 "selectNextAlgorithmicStep()",
204 "no plotting active, switch to first time step immediately"
205 );
207 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[0]}} )
208 );
209 }
210 // ============================================
211 // Phase 4: Run through the particle time steps
212 // ============================================
213 //
214 // Phase 4.a: Initial substeps
215 {% for STEP_NUMBER in range(0,SOLVERSTEP_NAMES|length-1) %}
216 else if (
217 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[STEP_NUMBER]}}
218 ) {
220 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[STEP_NUMBER+1]}} )
221 );
222 }
223 {% endfor %}
224 // Phase 4.b: Final step might switch back to 0 or plot. It might also terminate if we don't plot
225 else if (
226 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[-1]}}
227 and
228 ( repositories::getMinTimeStamp()>=MinTerminalTime or repositories::getMaxTimeStamp()>=MaxTerminalTime )
229 and
230 ( TimeInBetweenPlots>0.0 )
231 ) {
232 logInfo(
233 "selectNextAlgorithmicStep()",
234 "plot final solution"
235 );
237 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::Plot )
238 );
239 }
240 else if (
241 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[-1]}}
242 and
243 ( repositories::getMinTimeStamp()>=MinTerminalTime or repositories::getMaxTimeStamp()>=MaxTerminalTime )
244 ) {
245 continueToSolve = false;
246 }
247 else if (
248 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[-1]}}
249 and
250 TimeInBetweenPlots>0.0
251 and
252 (repositories::getMinTimeStamp()>=nextMinPlotTimeStamp or repositories::getMaxTimeStamp()>=nextMaxPlotTimeStamp)
253 ) {
254 if (repositories::getMinTimeStamp()>=nextMinPlotTimeStamp) {
255 nextMinPlotTimeStamp += TimeInBetweenPlots;
256 }
257 if (repositories::getMaxTimeStamp()>=nextMaxPlotTimeStamp) {
258 nextMaxPlotTimeStamp += TimeInBetweenPlots;
259 }
260
261 if ( nextMinPlotTimeStamp < repositories::getMinTimeStamp() ) {
263 "selectNextAlgorithmicStep()",
264 "code is asked to plot every dt=" << TimeInBetweenPlots << ", but this seems to be less than the time step size of the solvers. " <<
265 "So postpone next plot to t=" << (repositories::getMinTimeStamp() + TimeInBetweenPlots)
266 );
267 nextMinPlotTimeStamp = repositories::getMinTimeStamp() + TimeInBetweenPlots;
268 }
269 else if ( nextMaxPlotTimeStamp < repositories::getMaxTimeStamp() ) {
271 "selectNextAlgorithmicStep()",
272 "code is asked to plot every dt=" << TimeInBetweenPlots << ", but this seems to be less than the time step size of the solvers. " <<
273 "So postpone next plot to t=" << (repositories::getMaxTimeStamp() + TimeInBetweenPlots)
274 );
275 nextMaxPlotTimeStamp = repositories::getMaxTimeStamp() + TimeInBetweenPlots;
276 }
277
278 nextMaxPlotTimeStamp = std::max(nextMaxPlotTimeStamp,nextMinPlotTimeStamp);
279
281 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::Plot )
282 );
283 }
284 else if (
285 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[-1]}}
286 ) {
288 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[0]}} )
289 );
290 }
291 // ======================================================
292 // Phase 5: Switch back from plotting to time stepping
293 // ======================================================
294 else if (
295 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::Plot
296 and
297 ( repositories::getMinTimeStamp()>=MinTerminalTime or repositories::getMaxTimeStamp()>=MaxTerminalTime )
298 ) {
300 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::Cleanup )
301 );
302 }
303 else if (
304 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::Plot
305 ) {
307 repositories::StepRepository::toProgramStep( repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[0]}} )
308 );
309 }
310 // ======================================================
311 // Phase 6: Run Cleanup step
312 // ======================================================
313 else if (
314 repositories::StepRepository::toStepEnum(peano4::parallel::Node::getInstance().getCurrentProgramStep())==repositories::StepRepository::Steps::Cleanup
315 ) {
316 continueToSolve = false;
317 }
318 else {
319 logError( "selectNextAlgorithmicStep", "no switch variant found" );
320 assertion(false);
321 }
322
323 return continueToSolve;
324}
325
326
327tarch::timing::Watch watch( "::", "step()", false );
328
329
330void {{NAMESPACE | join("::")}}::step() {
332 auto stepName = repositories::StepRepository::toStepEnum(stepIdentifier);
333
334 static tarch::logging::Log _log("");
335 #if PeanoDebug>0
336 #else
337 if (tarch::mpi::Rank::getInstance().isGlobalMaster())
338 #endif
339 logInfo( "step()", "run " << repositories::StepRepository::toString(stepName) );
340
341 switch ( stepName ) {
342 case repositories::StepRepository::Steps::CreateGrid:
343 {
345 watch.start();
346 observers::CreateGrid observer;
347 observers::CreateGrid::prepareTraversal();
348 repositories::startGridConstructionStep();
350 observers::CreateGrid::unprepareTraversal();
351 repositories::finishGridConstructionStep();
352 watch.stop();
353 createGridMeasurement.setValue( watch.getCalendarTime() );
354 }
355 break;
356 case repositories::StepRepository::Steps::InitialConditions:
357 {
359 watch.start();
360 OTTER_PHASE_SWITCH("initial-conditions");
361 observers::InitialConditions observer;
362 observers::InitialConditions::prepareTraversal();
363 repositories::startInitialisationStep();
365 observers::InitialConditions::unprepareTraversal();
366 repositories::finishInitialisationStep();
367 watch.stop();
368 initialConditionMeasurement.setValue( watch.getCalendarTime() );
369 }
370 break;
371 case repositories::StepRepository::Steps::Plot:
372 {
374 watch.start();
375 OTTER_PHASE_SWITCH("plot");
376 observers::Plot observer;
377 observers::Plot::prepareTraversal();
378 repositories::startPlotStep();
380 observers::Plot::unprepareTraversal();
381 repositories::finishPlotStep();
382 watch.stop();
383 plotMeasurement.setValue( watch.getCalendarTime() );
384 }
385 break;
386 case repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[0]}}:
387 {
389 watch.start();
390 OTTER_PHASE_SWITCH("{{SOLVERSTEP_NAMES[0]}}");
391 observers::{{SOLVERSTEP_NAMES[0]}} observer;
392 observers::{{SOLVERSTEP_NAMES[0]}}::prepareTraversal();
393 repositories::startTimeStep();
394 repositories::startIntermediateStep();
396 observers::{{SOLVERSTEP_NAMES[0]}}::unprepareTraversal();
397 repositories::finishIntermediateStep();
398 }
399 break;
400 {% for STEP_NUMBER in range(1,SOLVERSTEP_NAMES|length-1) %}
401 case repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[STEP_NUMBER]}}:
402 {
403 OTTER_PHASE_SWITCH("{{SOLVERSTEP_NAMES[STEP_NUMBER]}}");
404 repositories::startIntermediateStep();
405 observers::{{SOLVERSTEP_NAMES[STEP_NUMBER]}} observer;
406 observers::{{SOLVERSTEP_NAMES[STEP_NUMBER]}}::prepareTraversal();
408 observers::{{SOLVERSTEP_NAMES[STEP_NUMBER]}}::unprepareTraversal();
409 repositories::finishIntermediateStep();
410 }
411 break;
412 {% endfor %}
413 case repositories::StepRepository::Steps::{{SOLVERSTEP_NAMES[-1]}}:
414 {
415 OTTER_PHASE_SWITCH("{{SOLVERSTEP_NAMES[-1]}}");
416 observers::{{SOLVERSTEP_NAMES[-1]}} observer;
417 observers::{{SOLVERSTEP_NAMES[-1]}}::prepareTraversal();
418 repositories::startIntermediateStep();
420 observers::{{SOLVERSTEP_NAMES[-1]}}::unprepareTraversal();
421 repositories::finishIntermediateStep();
422 repositories::finishTimeStep();
423 watch.stop();
424 timeStepMeasurement.setValue( watch.getCalendarTime() );
425 }
426 break;
427 {% for STEP_NUMBER in range(0,INITIALISATIONSTEP_NAMES|length) %}
428 case repositories::StepRepository::Steps::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}}:
429 {
430 OTTER_PHASE_SWITCH("{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}}");
431 repositories::startInitialisationStep();
432 observers::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}} observer;
433 observers::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}}::prepareTraversal();
435 observers::{{INITIALISATIONSTEP_NAMES[STEP_NUMBER]}}::unprepareTraversal();
436 repositories::finishInitialisationStep();
437 watch.stop();
438 initialisationMeasurement.setValue( watch.getCalendarTime() );
439 }
440 break;
441 {% endfor %}
442 case repositories::StepRepository::Steps::Cleanup:
443 {
445 watch.start();
446 OTTER_PHASE_SWITCH("cleanup");
447 observers::Cleanup observer;
448 observers::Cleanup::prepareTraversal();
449 repositories::startCleanupStep();
451 observers::Cleanup::unprepareTraversal();
452 repositories::finishCleanupStep();
453 watch.stop();
454 cleanupMeasurement.setValue( watch.getCalendarTime() );
455 }
456 break;
457 case repositories::StepRepository::Steps::Undef:
458 assertion(false);
459 break;
460 }
461}
462
463
464
465int main(int argc, char** argv) {
466 const int ExitCodeSuccess = 0;
467 const int ExitCodeUnitTestsFailed = 1;
468 const int ExitCodeInvalidArguments = 2;
469
470 {% if FENV_ARGS is defined and FENV_ARGS != "" -%}
471 feenableexcept({{FENV_ARGS}} );
472 {% endif -%}
473
478
480 {{NAMESPACE | join("::")}}::DomainOffset,
481 {{NAMESPACE | join("::")}}::DomainSize,
482 {{NAMESPACE | join("::")}}::PeriodicBC
483 );
484
485 {{NAMESPACE | join("::")}}::repositories::DataRepository::initDatatypes();
486
487 if (not swift2::parseCommandLineArguments(argc,argv) ) {
488 logError("main()", "Invalid command line arguments.");
489 return ExitCodeInvalidArguments;
490 }
491
492 #if PeanoDebug>=2
494 peanoCoreTests->run();
495 if (peanoCoreTests->getNumberOfErrors() != 0) {
496 logError("main()", "Peano4 core unit tests failed. Quit.");
497 exit(ExitCodeUnitTestsFailed);
498 }
499 delete peanoCoreTests;
500
502 tarchTests->run();
503 if (tarchTests->getNumberOfErrors() != 0) {
504 logError("main()", "technical architecture (tarch) unit tests failed. Quit.");
505 exit(ExitCodeUnitTestsFailed);
506 }
507 delete tarchTests;
508
510 swiftTests->run();
511 if (swiftTests->getNumberOfErrors() != 0) {
512 logError("main()", "Swift unit tests failed. Quit.");
513 exit(ExitCodeUnitTestsFailed);
514 }
515 delete swiftTests;
516
518 particlesTests->run();
519 if (particlesTests->getNumberOfErrors() != 0) {
520 logError("main()", "toolbox particles unit tests failed. Quit.");
521 exit(ExitCodeUnitTestsFailed);
522 }
523 delete particlesTests;
524 #endif
525
527
529
530
531 #if defined(SharedOMP)
532 #pragma omp parallel
533 {
534 #pragma omp master
535 {
536 #endif
537 if (tarch::mpi::Rank::getInstance().isGlobalMaster() ) {
538 while ( {{NAMESPACE | join("::")}}::selectNextAlgorithmicStep() ) {
539 {{NAMESPACE | join("::")}}::step();
540 }
541
542 logInfo("main()", "terminated successfully");
543 logInfo("main()", "grid construction: " << createGridMeasurement.getAccumulatedValue() << "s\t" << createGridMeasurement.toString() );
544 logInfo("main()", "initial conditions: " << initialConditionMeasurement.getAccumulatedValue() << "s\t" << initialConditionMeasurement.toString() );
545 logInfo("main()", "initialisation: " << initialisationMeasurement.getAccumulatedValue() << "s\t" << initialisationMeasurement.toString() );
546 logInfo("main()", "plotting: " << plotMeasurement.getAccumulatedValue() << "s\t" << plotMeasurement.toString() );
547 logInfo("main()", "cleanup: " << cleanupMeasurement.getAccumulatedValue() << "s\t" << cleanupMeasurement.toString() );
548 logInfo("main()", "time stepping: " << timeStepMeasurement.getAccumulatedValue() << "s\t" << timeStepMeasurement.toString() );
549 }
550 else {
551 while (peano4::parallel::Node::getInstance().continueToRun()) {
552 {{NAMESPACE | join("::")}}::step();
553 }
554 }
555 #if defined(SharedOMP)
556 }
557 }
558 #endif
559
561
563 {{NAMESPACE | join("::")}}::repositories::DataRepository::shutdownDatatypes();
565
566 return ExitCodeSuccess;
567}
568
#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
bool selectNextAlgorithmicStep()
tarch::timing::Measurement initialisationMeasurement
tarch::timing::Measurement createGridMeasurement
tarch::timing::Measurement timeStepMeasurement
tarch::timing::Measurement initialConditionMeasurement
tarch::timing::Measurement plotMeasurement
tarch::timing::Measurement cleanupMeasurement
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
static SpacetreeSet & getInstance()
void traverse(peano4::grid::TraversalObserver &observer)
Invoke traverse on all spacetrees in parallel.
void switchProgramPhase(const std::string &activeProgramPhase)
static LogFilter & getInstance()
Log Device.
Definition Log.h:516
static Statistics & getInstance()
This is not the canonical realisation of singletons as I use it usually for stats in Peano.
static Rank & getInstance()
This operation returns the singleton instance.
Definition Rank.cpp:539
Represents one test case.
Definition TestCase.h:57
int getNumberOfErrors() const
Definition TestCase.cpp:11
virtual void run()=0
This routine is triggered by the TestCaseCollection.
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::logging::Log _log("exahype2::fv")
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
bool parseCommandLineArguments(int argc, char **argv)
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:5
double max(double a, double b, double c)
I need the maximum of three values all the time, to I decided to write a function for this.
Definition Scalar.cpp:8
void initSmartMPI()
Switch on SmartMPI.
Definition multicore.cpp:33
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:17
bool hasNonCriticalAssertionBeenViolated()
void initNonCriticalAssertionEnvironment()
Register the assertion tag from the global communicator.
tarch::tests::TestCase * getUnitTests()
Please destroy after usage.
Definition UnitTests.cpp:12
#define OTTER_FINALISE()
Definition otter.h:125
#define OTTER_INITIALISE()
Definition otter.h:124
#define OTTER_PHASE_SWITCH(...)
Definition otter.h:144
Simple vector class.
Definition Vector.h:150