26 cpp_printer = DSL.printers.CPPPrinter(spaces_per_tab=4)
27 template_parameters = [DSL.SyntaxTree.Argument(
"DGOrder", DSL.SyntaxTree.TInteger()),
28 DSL.SyntaxTree.Argument(
"NumberOfUnknowns", DSL.SyntaxTree.TInteger()),
29 DSL.SyntaxTree.Argument(
"NumberOfAuxiliaryVariables", DSL.SyntaxTree.TInteger()),
30 DSL.SyntaxTree.Argument(
"EvaluateFlux", DSL.SyntaxTree.TBoolean()),
31 DSL.SyntaxTree.Argument(
"EvaluateNonconservativeProduct", DSL.SyntaxTree.TBoolean())]
33 functor_arguments = [DSL.SyntaxTree.Argument(
"flux", DSL.SyntaxTree.TCustom(
"const Flux&")),
34 DSL.SyntaxTree.Argument(
"nonconservativeProduct", DSL.SyntaxTree.TCustom(
"const NonConservativeProduct&"))]
36 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)
37 dg_riemann_x_stateless_kernel = dg_riemann_x_stateless_tree.print(cpp_printer)
38 dg_riemann_x_stateless_call_with_measurement = dg_riemann_x_stateless_tree.print_definition_with_timer(cpp_printer)
39 dg_riemann_x_stateless_kernel_declaration = dg_riemann_x_stateless_tree.print_declaration(cpp_printer)
40 dg_riemann_x_stateless_call_with_measurement_declaration = dg_riemann_x_stateless_tree.print_declaration_with_timer(cpp_printer)
42 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)
43 dg_riemann_y_stateless_kernel = dg_riemann_y_stateless_tree.print(cpp_printer)
44 dg_riemann_y_stateless_call_with_measurement = dg_riemann_y_stateless_tree.print_definition_with_timer(cpp_printer)
45 dg_riemann_y_stateless_kernel_declaration = dg_riemann_y_stateless_tree.print_declaration(cpp_printer)
46 dg_riemann_y_stateless_call_with_measurement_declaration = dg_riemann_y_stateless_tree.print_declaration_with_timer(cpp_printer)
48 if not os.path.exists(
"kernels"):
49 os.makedirs(
"kernels")
51 file = open(
"kernels/dg_riemann2d.h",
"w")
52 file.write(f
"""#pragma once
53#include "exahype2/CellData.h"
54#include "exahype2/VolumeIndex.h"
55#include "exahype2/dg/DGUtils.h"
56#include "exahype2/dg/Functors.h"
57#include "peano4/utils/Loop.h"
58#include "tarch/timing/Measurement.h"
59#include "tarch/timing/Watch.h"
62{dg_riemann_x_stateless_kernel_declaration}
63{dg_riemann_x_stateless_call_with_measurement_declaration}
65{dg_riemann_y_stateless_kernel_declaration}
66{dg_riemann_y_stateless_call_with_measurement_declaration}
68namespace exahype2::dg::rusanov {{
69template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
70 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);
73#include "dg_riemann2d.cpph"
77 file = open(
"kernels/dg_riemann2d.cpph",
"w")
78 file.write(dg_riemann_x_stateless_kernel)
79 file.write(dg_riemann_x_stateless_call_with_measurement)
80 file.write(dg_riemann_y_stateless_kernel)
81 file.write(dg_riemann_y_stateless_call_with_measurement)
83namespace exahype2::dg::rusanov {
84 template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
85 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){
86 switch(faceNumber % Dimensions) {
88 solveRiemannProblemXStateless<
92 NumberOfAuxiliaryVariables,
94 EvaluateNonconservativeProduct
105 solveRiemannProblemYStateless<
109 NumberOfAuxiliaryVariables,
111 EvaluateNonconservativeProduct
128 cpp_printer = DSL.printers.CPPPrinter(spaces_per_tab=4)
129 template_parameters = [DSL.SyntaxTree.Argument(
"DGOrder", DSL.SyntaxTree.TInteger()),
130 DSL.SyntaxTree.Argument(
"NumberOfUnknowns", DSL.SyntaxTree.TInteger()),
131 DSL.SyntaxTree.Argument(
"NumberOfAuxiliaryVariables", DSL.SyntaxTree.TInteger()),
132 DSL.SyntaxTree.Argument(
"EvaluateFlux", DSL.SyntaxTree.TBoolean()),
133 DSL.SyntaxTree.Argument(
"EvaluateNonconservativeProduct", DSL.SyntaxTree.TBoolean())]
135 functor_arguments = [DSL.SyntaxTree.Argument(
"flux", DSL.SyntaxTree.TCustom(
"const Flux&")),
136 DSL.SyntaxTree.Argument(
"nonconservativeProduct", DSL.SyntaxTree.TCustom(
"const NonConservativeProduct&"))]
138 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)
139 dg_riemann_x_stateless_kernel = dg_riemann_x_stateless_tree.print(cpp_printer)
140 dg_riemann_x_stateless_call_with_measurement = dg_riemann_x_stateless_tree.print_definition_with_timer(cpp_printer)
141 dg_riemann_x_stateless_kernel_declaration = dg_riemann_x_stateless_tree.print_declaration(cpp_printer)
142 dg_riemann_x_stateless_call_with_measurement_declaration = dg_riemann_x_stateless_tree.print_declaration_with_timer(cpp_printer)
144 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)
145 dg_riemann_y_stateless_kernel = dg_riemann_y_stateless_tree.print(cpp_printer)
146 dg_riemann_y_stateless_call_with_measurement = dg_riemann_y_stateless_tree.print_definition_with_timer(cpp_printer)
147 dg_riemann_y_stateless_kernel_declaration = dg_riemann_y_stateless_tree.print_declaration(cpp_printer)
148 dg_riemann_y_stateless_call_with_measurement_declaration = dg_riemann_y_stateless_tree.print_declaration_with_timer(cpp_printer)
150 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)
151 dg_riemann_z_stateless_kernel = dg_riemann_z_stateless_tree.print(cpp_printer)
152 dg_riemann_z_stateless_call_with_measurement = dg_riemann_z_stateless_tree.print_definition_with_timer(cpp_printer)
153 dg_riemann_z_stateless_kernel_declaration = dg_riemann_z_stateless_tree.print_declaration(cpp_printer)
154 dg_riemann_z_stateless_call_with_measurement_declaration = dg_riemann_z_stateless_tree.print_declaration_with_timer(cpp_printer)
156 if not os.path.exists(
"kernels"):
157 os.makedirs(
"kernels")
159 file = open(
"kernels/dg_riemann3d.h",
"w")
160 file.write(f
"""#pragma once
161#include "exahype2/CellData.h"
162#include "exahype2/VolumeIndex.h"
163#include "exahype2/dg/DGUtils.h"
164#include "exahype2/dg/Functors.h"
165#include "peano4/utils/Loop.h"
166#include "tarch/timing/Measurement.h"
167#include "tarch/timing/Watch.h"
170{dg_riemann_x_stateless_kernel_declaration}
171{dg_riemann_x_stateless_call_with_measurement_declaration}
173{dg_riemann_y_stateless_kernel_declaration}
174{dg_riemann_y_stateless_call_with_measurement_declaration}
176{dg_riemann_z_stateless_kernel_declaration}
177{dg_riemann_z_stateless_call_with_measurement_declaration}
179namespace exahype2::dg::rusanov {{
180template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
181 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);
184#include "dg_riemann3d.cpph"
188 file = open(
"kernels/dg_riemann3d.cpph",
"w")
189 file.write(dg_riemann_x_stateless_kernel)
190 file.write(dg_riemann_x_stateless_call_with_measurement)
191 file.write(dg_riemann_y_stateless_kernel)
192 file.write(dg_riemann_y_stateless_call_with_measurement)
193 file.write(dg_riemann_z_stateless_kernel)
194 file.write(dg_riemann_z_stateless_call_with_measurement)
196namespace exahype2::dg::rusanov {
197 template <class SolverType,int DGOrder,int NumberOfUnknowns,int NumberOfAuxiliaryVariables,bool EvaluateFlux,bool EvaluateNonconservativeProduct>
198 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){
199 switch(faceNumber % Dimensions) {
201 solveRiemannProblemXStateless<
205 NumberOfAuxiliaryVariables,
207 EvaluateNonconservativeProduct
218 solveRiemannProblemYStateless<
222 NumberOfAuxiliaryVariables,
224 EvaluateNonconservativeProduct
235 solveRiemannProblemZStateless<
239 NumberOfAuxiliaryVariables,
241 EvaluateNonconservativeProduct
278def create_Riemann_solver_call(polynomial_basis,
279 face_projections: FaceProjections):
281 number_of_face_projections: Integer
282 How many quantities are to be projected onto the face. If you pass in one,
283 this means that only the left and right values are projected onto the face.
284 If you pass in two, we store the values plus the projections of the
285 derivative along the normal per face.
288 if isinstance( polynomial_basis, exahype2.solvers.GaussLegendreBasis)
and face_projections==FaceProjections.Solution:
289 return """solveRiemannProblem_pointwise_in_situ(
291 const double * __restrict__ Q,
292 const tarch::la::Vector<Dimensions,double>& x,
296 double * __restrict__ F
298 {% if FLUX_IMPLEMENTATION!="<none>" %}
299 repositories::{{SOLVER_INSTANCE}}.flux(Q,x,t,dt,normal,F);
303 const double * __restrict__ Q,
304 const double * __restrict__ deltaQ,
305 const tarch::la::Vector<Dimensions,double>& x,
309 double * __restrict__ F
311 {% if NCP_IMPLEMENTATION!="<none>" %}
312 repositories::{{SOLVER_INSTANCE}}.nonconservativeProduct(Q, deltaQ, x, t, dt, normal, F);
316 const double * __restrict__ Q,
317 const tarch::la::Vector<Dimensions,double>& x,
321 double* maxEigenvalue
323 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue(Q, x, t, dt, normal, maxEigenvalue);
330 {{NUMBER_OF_UNKNOWNS}},
331 {{NUMBER_OF_AUXILIARY_VARIABLES}},
332 marker.getSelectedFaceNumber(),
333 repositories::{{SOLVER_INSTANCE}}.QuadraturePoints1d,
334 {{ "true" if FLUX_IMPLEMENTATION!="<none>" else "false" }}, //useFlux
335 {{ "true" if NCP_IMPLEMENTATION!="<none>" else "false" }}, //useNCP
336 fineGridFace{{UNKNOWN_IDENTIFIER}}EstimateProjection.value,
337 fineGridFace{{UNKNOWN_IDENTIFIER}}RiemannSolution.value
340 elif isinstance( polynomial_basis, exahype2.solvers.GaussLegendreBasis)
and number_of_face_projections==2:
341 return """solveRiemannProblem_pointwise_in_situ_with_gradient_projection(
343 const double * __restrict__ Q,
344 const tarch::la::Vector<Dimensions,double>& x,
348 double * __restrict__ F
350 {% if FLUX_IMPLEMENTATION!="<none>" %}
351 repositories::{{SOLVER_INSTANCE}}.flux(Q,x,t,dt,normal,F);
355 const double * __restrict__ Q,
356 const double * __restrict__ deltaQ,
357 const tarch::la::Vector<Dimensions,double>& x,
361 double * __restrict__ F
363 {% if NCP_IMPLEMENTATION!="<none>" %}
364 repositories::{{SOLVER_INSTANCE}}.nonconservativeProduct(Q, deltaQ, x, t, dt, normal, F);
368 const double * __restrict__ Q,
369 const tarch::la::Vector<Dimensions,double>& x,
373 double* maxEigenvalue
375 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue(Q, x, t, dt, normal, maxEigenvalue);
382 {{NUMBER_OF_UNKNOWNS}},
383 {{NUMBER_OF_AUXILIARY_VARIABLES}},
384 marker.getSelectedFaceNumber(),
385 repositories::{{SOLVER_INSTANCE}}.QuadraturePoints1d,
386 {{ "true" if FLUX_IMPLEMENTATION!="<none>" else "false" }}, //useFlux
387 {{ "true" if NCP_IMPLEMENTATION!="<none>" else "false" }}, //useNCP
388 fineGridFace{{UNKNOWN_IDENTIFIER}}EstimateProjection.value,
389 fineGridFace{{UNKNOWN_IDENTIFIER}}RiemannSolution.value
393 assert False,
"not implemented"
394 return "#not implemented"