9 #include "exahype2/Solver.h"
11 #include "tarch/la/Vector.h"
12 #include "tarch/logging/Log.h"
13 #include "tarch/NonCriticalAssertions.h"
14 #include "tarch/mpi/Rank.h"
15 #include "tarch/multicore/BooleanSemaphore.h"
17 #include "peano4/utils/Globals.h"
19 #include "Constants.h"
23 {%
for item in NAMESPACE -%}
24 namespace {{ item }} {
29 {%
for item in NAMESPACE -%}
33 class {{NAMESPACE | join(
"::")}}::{{CLASSNAME}}: public ::exahype2::Solver {
52 enum class Offloadable {
56 enum class SolverState {
59 LimiterStatusSpreadingToNeighbours,
62 PlottingAfterGridInitialisation,
66 static std::string toString(SolverState);
71 SolverState getSolverState()
const;
73 double getMinTimeStamp(
bool ofCurrentlyRunningGridSweep=
false) const final;
74 double getMaxTimeStamp(
bool ofCurrentlyRunningGridSweep=false) const final;
75 double getMinTimeStepSize() const final;
76 double getMaxTimeStepSize() const final;
78 virtual
double getMaxMeshSize() const override final;
79 virtual
double getMinMeshSize() const override final;
82 static constexpr
double MaxAdmissibleCellH = 1000.;
83 static constexpr
double MinAdmissibleCellH = 0.;
89 virtual
void startGridConstructionStep() override;
95 virtual
void finishGridConstructionStep() override;
102 virtual
void startGridInitialisationStep() override;
108 virtual
void finishGridInitialisationStep() override;
111 virtual
void suspendSolversForOneGridSweep() override;
118 virtual
void startTimeStep() override;
124 virtual
void finishTimeStep() override;
126 virtual
void printTimeStep(
bool ofCurrentlyRunningGridSweep) override;
132 virtual
void startPlottingStep() override;
138 virtual
void finishPlottingStep() override;
143 virtual
bool mayPlot() const override;
149 bool isFirstGridSweepOfTimeStep() const;
150 bool isLastGridSweepOfTimeStep() const;
156 virtual
void startSimulation() override;
162 virtual
void finishSimulation() override;
171 void addTroubledCell();
172 int getNumberOfTroubledCells() const;
177 void mapDiscreteMaximumPrincipleObservables(
double* const observables, const
double* const Q)
const {
178 ::tarch::triggerNonCriticalAssertion( __FILE__, __LINE__,
"map discrete maximum principle observables was called, it should never be.",
"" );
184 double getDiscreteMaximumPrincipleRelaxationParameter(
185 const double& specifiedRelaxationParameter,
186 const int& observable,
187 const double& localMin,
188 const double& localMax,
189 const double& boundaryMinPerObservable,
190 const double& previousMax)
const {
191 ::tarch::triggerNonCriticalAssertion( __FILE__, __LINE__,
"get discrete maximum principle relaxation parameter was called, it should never be.",
"" );
195 {%
if ADMISSIBILITY_IMPLEMENTATION!=
"<none>" %}
197 const {{REGULAR_SOLVER_STORAGE_PRECISION}}*
const Q,
198 const tarch::la::Vector<DIMENSIONS,double>&
x,
199 const tarch::la::Vector<DIMENSIONS,double>&
h,
200 const double timeStamp) {%
if ADMISSIBILITY_IMPLEMENTATION==
"<user-defined>" %} = 0 {%
else %}
final {% endif %};
205 static tarch::logging::Log
_log;
207 SolverState _solverState;
213 tarch::multicore::BooleanSemaphore _semaphore;
216 {{SOLVER_USER_DECLARATIONS}}
_totalNumberOfTroubledCells(0)
constexpr double timeStamp
string isPhysicallyAdmissible
tarch::logging::Log _log
This is variant 1 of the fused kernels.