Peano
Loading...
Searching...
No Matches
SingleSweepAbstract.template.h
Go to the documentation of this file.
1// This file is part of the ExaHyPE2 project. For conditions of distribution and
2// use, please see the copyright notice at www.peano-framework.org
3#pragma once
4
5#include <algorithm>
6
7#include "Constants.h"
8
9#include "exahype2/Solver.h"
12
14#include "tarch/la/Vector.h"
16
18
19#include "kernels/{{SOLVER_NAME}}/Quadrature.h"
20#include "kernels/{{SOLVER_NAME}}/DGMatrices.h"
21
22{% if USE_HALF_PRECISION==True %}
23#include <stdfloat>
24{% endif %}
25
26{% if USE_VARIABLE_SHORTCUT is sameas True %}
27#include "VariableShortcuts.h"
28{% endif %}
29
30{{SOLVER_INCLUDES}}
31
32{% for item in NAMESPACE -%}
33namespace {{ item }} {
34{%- endfor %}
35
36 class {{CLASSNAME}};
37
38{% for item in NAMESPACE -%}
39}
40{%- endfor %}
41
42class {{NAMESPACE | join("::")}}::{{CLASSNAME}}: public ::exahype2::Solver {
43 public:
44 enum class SolverState {
45 GridConstruction,
46 GridInitialisation,
47 InitialPrediction,
48 PredictionOnHangingCells,
49 TimeStep,
50 Plotting,
51 Suspended
52 };
53
54 static std::string toString(SolverState);
55
56 static constexpr int Order = {{ORDER}};
57 static constexpr int NumberOfUnknowns = {{NUMBER_OF_UNKNOWNS}};
58 static constexpr int NumberOfAuxiliaryVariables = {{NUMBER_OF_AUXILIARY_VARIABLES}};
59 //static constexpr int MaxPicardIterations = {{ORDER}} + 1; // TODO: Not used (maybe use in nonlinear FSTPVI?)
60 //static constexpr bool UseMaxPicardIterations = true; // TODO: Not used (maybe use in nonlinear FSTPVI?)
61 //static constexpr bool UseLobattoBasis = {{USE_GAUSS_LOBATTO}}; // TODO: Not used
62 static constexpr double CFL = {{CFL_SAFETY_FACTOR}};
63 static constexpr double PNPM = {{CFL_ADER}};
64
65 // User-defined solver constants
66 {{SOLVER_CONSTANTS}}
67
68 {% if USE_POINT_SOURCE %}
69 static constexpr int NumberOfPointSources = {{NUMBER_OF_POINT_SOURCES}};
70 double pointSourceLocation[NumberOfPointSources][Dimensions];
71 {% endif %}
72
78 static constexpr double MaxAdmissibleCellH = {{MAX_CELL_H}};
79
88 static constexpr double MinAdmissibleCellH = {{MIN_CELL_H}};
89
90 {{CLASSNAME}}();
91 ~{{CLASSNAME}}();
92
96 static std::bitset<Dimensions> PeriodicBC;
97
98 double getMinTimeStamp() const final;
99 double getMaxTimeStamp() const final;
100 double getMinTimeStepSize() const final;
101 double getMaxTimeStepSize() const final;
102
111 virtual ::exahype2::RefinementCommand refinementCriterion(
112 const {{SOLUTION_STORAGE_PRECISION}} * __restrict__ Q, // Q[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
115 double t
116 ) {% if REFINEMENT_CRITERION_IMPLEMENTATION=="<user-defined>" %}= 0{% else %} final {% endif %};
117
134 virtual void initialCondition(
135 {{SOLUTION_STORAGE_PRECISION}}* __restrict__ Q, // Q[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
138 //const tarch::la::Vector<Dimensions, int>& index,
139 bool gridIsConstructed
140 ) {% if INITIAL_CONDITIONS_IMPLEMENTATION=="<user-defined>" %}= 0{% else %} final {% endif %};
141
161 virtual void boundaryConditions(
162 const {{CORRECTOR_COMPUTATION_PRECISION}} * __restrict__ Qinside, // Qinside[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
163 {{CORRECTOR_COMPUTATION_PRECISION}} * __restrict__ Qoutside, // Qoutside[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
166 double t,
167 int normal
168 ){% if BOUNDARY_CONDITIONS_IMPLEMENTATION=="<user-defined>" %}= 0{% else %} final{% endif %};
169
170 {% if ADAPTIVE_PRECISION_IMPLEMENTATION!="<none>" %}
180 virtual ::exahype2::PrecisionCommand precisionCriterion(
181 const {{SOLUTION_STORAGE_PRECISION}} * __restrict__ Q, // Q[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
184 double t,
185 SolverState currentState
186 ) {% if ADAPTIVE_PRECISION_IMPLEMENTATION=="<user-defined>" %} = 0{% else %} final {% endif %};
187 {% endif %}
188
189 {% if RIEMANN_SOLVER_IMPLEMENTATION!="<none>" %}
199 virtual void riemannSolver(
200 {{CORRECTOR_COMPUTATION_PRECISION}}* const FL, // FL[{{NUMBER_OF_UNKNOWNS}}
201 {{CORRECTOR_COMPUTATION_PRECISION}}* const FR, // FR[{{NUMBER_OF_UNKNOWNS}}
202 const {{CORRECTOR_COMPUTATION_PRECISION}}* const QL, // QL[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
203 const {{CORRECTOR_COMPUTATION_PRECISION}}* const QR, // QR[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
204 const double t,
205 const double dt,
208 const int direction,
209 bool isBoundaryFace,
210 int faceIndex) {% if RIEMANN_SOLVER_IMPLEMENTATION=="<user-defined>" %} = 0{% else %} final {% endif %};
211 {% endif %}
212
217 virtual void startGridConstructionStep() override;
218
223 virtual void finishGridConstructionStep() override;
224
225
230 virtual void startGridInitialisationStep() override;
231
236 virtual void finishGridInitialisationStep() override;
237
238 virtual void suspendSolversForOneGridSweep() override;
239
244 virtual void startTimeStep(
245 double globalMinTimeStamp,
246 double globalMaxTimeStamp,
247 double globalMinTimeStepSize,
248 double globalMaxTimeStepSize
249 ) override;
250
255 virtual void finishTimeStep() override;
256
261 virtual void startPlottingStep(
262 double globalMinTimeStamp,
263 double globalMaxTimeStamp,
264 double globalMinTimeStepSize,
265 double globalMaxTimeStepSize
266 ) override;
267
272 virtual void finishPlottingStep() override;
273
277 double getMaxCellSize() const;
278 double getMinCellSize() const;
279
283 virtual double getMaxMeshSize() const override final;
284 virtual double getMinMeshSize() const override final;
285
292 void update(double timeStepSize, double timeStamp, double cellSize);
293
294 SolverState getSolverState() const;
295
299 virtual bool mayPlot() const override;
300
305 bool isFirstGridSweepOfTimeStep() const;
306 bool isLastGridSweepOfTimeStep() const;
307
312 virtual void startSimulation() override;
313
318 virtual void finishSimulation() override;
319
320 {{ABSTRACT_SOLVER_USER_DECLARATIONS}}
321
322 protected:
324
325 SolverState _solverState;
326
327 double _minTimeStamp;
328 double _maxTimeStamp;
329
330 double _minTimeStampThisTimeStep;
331 double _maxTimeStampThisTimeStep;
332
333 double _localMinTimeStampThisTimeStep;
334 double _localMaxTimeStampThisTimeStep;
335
336 double _minCellH;
337 double _maxCellH;
338
339 double _minCellHThisTimeStep;
340 double _maxCellHThisTimeStep;
341
342 double _minTimeStepSize;
343 double _maxTimeStepSize;
344
345 double _minTimeStepSizeThisTimeStep;
346 double _maxTimeStepSizeThisTimeStep;
347
348 int _cellUpdates;
349
351};
std::string toString(exahype2::RefinementCommand value)
Log Device.
Definition Log.h:517
void riemannSolver(double *FL, double *FR, const double *const QL, const double *const QR, const double dt, const int direction, bool isBoundaryFace, int faceIndex)
This file is part of the ExaHyPE 2 project within Peano 4.
Definition __init__.py:1
Simple vector class.
Definition Vector.h:159