26 template_parameters = [DSL.SyntaxTree.Argument(
"DGOrder", DSL.SyntaxTree.TInteger()),
27 DSL.SyntaxTree.Argument(
"NumberOfUnknowns", DSL.SyntaxTree.TInteger()),
28 DSL.SyntaxTree.Argument(
"NumberOfAuxiliaryVariables", DSL.SyntaxTree.TInteger()),
29 DSL.SyntaxTree.Argument(
"EvaluateFlux", DSL.SyntaxTree.TBoolean()),
30 DSL.SyntaxTree.Argument(
"EvaluateNonconservativeProduct", DSL.SyntaxTree.TBoolean())]
32 functor_arguments = [DSL.SyntaxTree.Argument(
"flux", DSL.SyntaxTree.TCustom(
"const Flux&")),
33 DSL.SyntaxTree.Argument(
"nonconservativeProduct", DSL.SyntaxTree.TCustom(
"const NonConservativeProduct&"))]
35 dg_riemann_x_stateless_tree = DSL.Parser().parse(exahype2.solvers.rkdg.rusanov.solveRiemannProblemX2D, template_parameters, functor_arguments, [
"exahype2",
"dg",
"rusanov"], stateless=
True, use_accelerator=
False)
36 dg_riemann_x_stateless_kernel = dg_riemann_x_stateless_tree.print_cpp()
37 dg_riemann_x_stateless_call_with_measurement = dg_riemann_x_stateless_tree.print_definition_with_timer()
38 dg_riemann_x_stateless_kernel_declaration = dg_riemann_x_stateless_tree.print_declaration()
39 dg_riemann_x_stateless_call_with_measurement_declaration = dg_riemann_x_stateless_tree.print_declaration_with_timer()
41 dg_riemann_y_stateless_tree = DSL.Parser().parse(exahype2.solvers.rkdg.rusanov.solveRiemannProblemY2D, template_parameters, functor_arguments, [
"exahype2",
"dg",
"rusanov"], stateless=
True, use_accelerator=
False)
42 dg_riemann_y_stateless_kernel = dg_riemann_y_stateless_tree.print_cpp()
43 dg_riemann_y_stateless_call_with_measurement = dg_riemann_y_stateless_tree.print_definition_with_timer()
44 dg_riemann_y_stateless_kernel_declaration = dg_riemann_y_stateless_tree.print_declaration()
45 dg_riemann_y_stateless_call_with_measurement_declaration = dg_riemann_y_stateless_tree.print_declaration_with_timer()
47 if not os.path.exists(
"kernels"):
48 os.makedirs(
"kernels")
50 file = open(
"kernels/dg_riemann2d.h",
"w")
51 file.write(f
"""#pragma once
52#include "exahype2/CellData.h"
53#include "exahype2/VolumeIndex.h"
54#include "exahype2/dg/DGUtils.h"
55#include "exahype2/dg/Functors.h"
56#include "peano4/utils/Loop.h"
57#include "tarch/timing/Measurement.h"
58#include "tarch/timing/Watch.h"
61{dg_riemann_x_stateless_kernel_declaration}
62{dg_riemann_x_stateless_call_with_measurement_declaration}
64{dg_riemann_y_stateless_kernel_declaration}
65{dg_riemann_y_stateless_call_with_measurement_declaration}
67namespace exahype2::dg::rusanov {{
68template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
69 void solveRiemannProblemStateless(const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& cellSize, double t, double dt, int faceNumber, const double* __restrict__ faceData, double* __restrict__ solution);
72#include "dg_riemann2d.cpph"
76 file = open(
"kernels/dg_riemann2d.cpph",
"w")
77 file.write(dg_riemann_x_stateless_kernel)
78 file.write(dg_riemann_x_stateless_call_with_measurement)
79 file.write(dg_riemann_y_stateless_kernel)
80 file.write(dg_riemann_y_stateless_call_with_measurement)
82namespace exahype2::dg::rusanov {
83 template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
84 void solveRiemannProblemStateless(const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& cellSize, double t, double dt, int faceNumber,const double* __restrict__ faceData, double* __restrict__ solution){
85 switch(faceNumber % Dimensions) {
87 solveRiemannProblemXStateless<
91 NumberOfAuxiliaryVariables,
93 EvaluateNonconservativeProduct
104 solveRiemannProblemYStateless<
108 NumberOfAuxiliaryVariables,
110 EvaluateNonconservativeProduct
127 template_parameters = [DSL.SyntaxTree.Argument(
"DGOrder", DSL.SyntaxTree.TInteger()),
128 DSL.SyntaxTree.Argument(
"NumberOfUnknowns", DSL.SyntaxTree.TInteger()),
129 DSL.SyntaxTree.Argument(
"NumberOfAuxiliaryVariables", DSL.SyntaxTree.TInteger()),
130 DSL.SyntaxTree.Argument(
"EvaluateFlux", DSL.SyntaxTree.TBoolean()),
131 DSL.SyntaxTree.Argument(
"EvaluateNonconservativeProduct", DSL.SyntaxTree.TBoolean())]
133 functor_arguments = [DSL.SyntaxTree.Argument(
"flux", DSL.SyntaxTree.TCustom(
"const Flux&")),
134 DSL.SyntaxTree.Argument(
"nonconservativeProduct", DSL.SyntaxTree.TCustom(
"const NonConservativeProduct&"))]
136 dg_riemann_x_stateless_tree = DSL.Parser().parse(exahype2.solvers.rkdg.rusanov.solveRiemannProblemX3D, template_parameters, functor_arguments, [
"exahype2",
"dg",
"rusanov"], stateless=
True, use_accelerator=
False)
137 dg_riemann_x_stateless_kernel = dg_riemann_x_stateless_tree.print_cpp()
138 dg_riemann_x_stateless_call_with_measurement = dg_riemann_x_stateless_tree.print_definition_with_timer()
139 dg_riemann_x_stateless_kernel_declaration = dg_riemann_x_stateless_tree.print_declaration()
140 dg_riemann_x_stateless_call_with_measurement_declaration = dg_riemann_x_stateless_tree.print_declaration_with_timer()
142 dg_riemann_y_stateless_tree = DSL.Parser().parse(exahype2.solvers.rkdg.rusanov.solveRiemannProblemY3D, template_parameters, functor_arguments, [
"exahype2",
"dg",
"rusanov"], stateless=
True, use_accelerator=
False)
143 dg_riemann_y_stateless_kernel = dg_riemann_y_stateless_tree.print_cpp()
144 dg_riemann_y_stateless_call_with_measurement = dg_riemann_y_stateless_tree.print_definition_with_timer()
145 dg_riemann_y_stateless_kernel_declaration = dg_riemann_y_stateless_tree.print_declaration()
146 dg_riemann_y_stateless_call_with_measurement_declaration = dg_riemann_y_stateless_tree.print_declaration_with_timer()
148 dg_riemann_z_stateless_tree = DSL.Parser().parse(exahype2.solvers.rkdg.rusanov.solveRiemannProblemZ3D, template_parameters, functor_arguments, [
"exahype2",
"dg",
"rusanov"], stateless=
True, use_accelerator=
False)
149 dg_riemann_z_stateless_kernel = dg_riemann_z_stateless_tree.print_cpp()
150 dg_riemann_z_stateless_call_with_measurement = dg_riemann_z_stateless_tree.print_definition_with_timer()
151 dg_riemann_z_stateless_kernel_declaration = dg_riemann_z_stateless_tree.print_declaration()
152 dg_riemann_z_stateless_call_with_measurement_declaration = dg_riemann_z_stateless_tree.print_declaration_with_timer()
154 if not os.path.exists(
"kernels"):
155 os.makedirs(
"kernels")
157 file = open(
"kernels/dg_riemann3d.h",
"w")
158 file.write(f
"""#pragma once
159#include "exahype2/CellData.h"
160#include "exahype2/VolumeIndex.h"
161#include "exahype2/dg/DGUtils.h"
162#include "exahype2/dg/Functors.h"
163#include "peano4/utils/Loop.h"
164#include "tarch/timing/Measurement.h"
165#include "tarch/timing/Watch.h"
168{dg_riemann_x_stateless_kernel_declaration}
169{dg_riemann_x_stateless_call_with_measurement_declaration}
171{dg_riemann_y_stateless_kernel_declaration}
172{dg_riemann_y_stateless_call_with_measurement_declaration}
174{dg_riemann_z_stateless_kernel_declaration}
175{dg_riemann_z_stateless_call_with_measurement_declaration}
177namespace exahype2::dg::rusanov {{
178template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
179 void solveRiemannProblemStateless(const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& cellSize, double t, double dt, int faceNumber, const double* __restrict__ faceData, double* __restrict__ solution);
182#include "dg_riemann3d.cpph"
186 file = open(
"kernels/dg_riemann3d.cpph",
"w")
187 file.write(dg_riemann_x_stateless_kernel)
188 file.write(dg_riemann_x_stateless_call_with_measurement)
189 file.write(dg_riemann_y_stateless_kernel)
190 file.write(dg_riemann_y_stateless_call_with_measurement)
191 file.write(dg_riemann_z_stateless_kernel)
192 file.write(dg_riemann_z_stateless_call_with_measurement)
194namespace exahype2::dg::rusanov {
195 template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
196 void solveRiemannProblemStateless(const tarch::la::Vector<Dimensions,double>& faceCentre, const tarch::la::Vector<Dimensions,double>& cellSize, double t, double dt, int faceNumber, const double* __restrict__ faceData, double* __restrict__ solution){
197 switch(faceNumber % Dimensions) {
199 solveRiemannProblemXStateless<
203 NumberOfAuxiliaryVariables,
205 EvaluateNonconservativeProduct
216 solveRiemannProblemYStateless<
220 NumberOfAuxiliaryVariables,
222 EvaluateNonconservativeProduct
233 solveRiemannProblemZStateless<
237 NumberOfAuxiliaryVariables,
239 EvaluateNonconservativeProduct
277 face_projections: FaceProjections):
279 number_of_face_projections: Integer
280 How many quantities are to be projected onto the face. If you pass in one,
281 this means that only the left and right values are projected onto the face.
282 If you pass in two, we store the values plus the projections of the
283 derivative along the normal per face.
287 return """solveRiemannProblem_pointwise_in_situ(
289 const double * __restrict__ Q,
290 const tarch::la::Vector<Dimensions,double>& x,
294 double * __restrict__ F
296 {% if FLUX_IMPLEMENTATION!="<none>" %}
297 repositories::{{SOLVER_INSTANCE}}.flux(Q,x,t,dt,normal,F);
301 const double * __restrict__ Q,
302 const double * __restrict__ deltaQ,
303 const tarch::la::Vector<Dimensions,double>& x,
307 double * __restrict__ F
309 {% if NCP_IMPLEMENTATION!="<none>" %}
310 repositories::{{SOLVER_INSTANCE}}.nonconservativeProduct(Q, deltaQ, x, t, dt, normal, F);
314 const double * __restrict__ Q,
315 const tarch::la::Vector<Dimensions,double>& x,
319 double* maxEigenvalue
321 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue(Q, x, t, dt, normal, maxEigenvalue);
328 {{NUMBER_OF_UNKNOWNS}},
329 {{NUMBER_OF_AUXILIARY_VARIABLES}},
330 marker.getSelectedFaceNumber(),
331 repositories::{{SOLVER_INSTANCE}}.QuadraturePoints1d,
332 {{ "true" if FLUX_IMPLEMENTATION!="<none>" else "false" }}, //useFlux
333 {{ "true" if NCP_IMPLEMENTATION!="<none>" else "false" }}, //useNCP
334 fineGridFace{{UNKNOWN_IDENTIFIER}}EstimateProjection.value,
335 fineGridFace{{UNKNOWN_IDENTIFIER}}RiemannSolution.value
339 return """solveRiemannProblem_pointwise_in_situ_with_gradient_projection(
341 const double * __restrict__ Q,
342 const tarch::la::Vector<Dimensions,double>& x,
346 double * __restrict__ F
348 {% if FLUX_IMPLEMENTATION!="<none>" %}
349 repositories::{{SOLVER_INSTANCE}}.flux(Q,x,t,dt,normal,F);
353 const double * __restrict__ Q,
354 const double * __restrict__ deltaQ,
355 const tarch::la::Vector<Dimensions,double>& x,
359 double * __restrict__ F
361 {% if NCP_IMPLEMENTATION!="<none>" %}
362 repositories::{{SOLVER_INSTANCE}}.nonconservativeProduct(Q, deltaQ, x, t, dt, normal, F);
366 const double * __restrict__ Q,
367 const tarch::la::Vector<Dimensions,double>& x,
371 double* maxEigenvalue
373 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue(Q, x, t, dt, normal, maxEigenvalue);
380 {{NUMBER_OF_UNKNOWNS}},
381 {{NUMBER_OF_AUXILIARY_VARIABLES}},
382 marker.getSelectedFaceNumber(),
383 repositories::{{SOLVER_INSTANCE}}.QuadraturePoints1d,
384 {{ "true" if FLUX_IMPLEMENTATION!="<none>" else "false" }}, //useFlux
385 {{ "true" if NCP_IMPLEMENTATION!="<none>" else "false" }}, //useNCP
386 fineGridFace{{UNKNOWN_IDENTIFIER}}EstimateProjection.value,
387 fineGridFace{{UNKNOWN_IDENTIFIER}}RiemannSolution.value
391 assert False,
"not implemented"
392 return "#not implemented"