7 constexpr double DamRadius = 1.0;
9 const double domainSizeHalfX = DomainSize[0] / 2.0;
10 const double domainSizeHalfY = DomainSize[1] / 2.0;
12 const double distanceFromOrigin = std::sqrt(
13 (x[0] - domainSizeHalfX) * (x[0] - domainSizeHalfX) +
14 (x[1] - domainSizeHalfY) * (x[1] - domainSizeHalfY)
17 const bool isInsideDam = distanceFromOrigin <= DamRadius;
18 const bool isOutsideDam = distanceFromOrigin > DamRadius;
19 const bool isDryRing = distanceFromOrigin >= 2 * DamRadius and distanceFromOrigin <= 3 * DamRadius;
25 constexpr double InitialWaterHeightInsideDam = 1.1;
26 constexpr double InitialWaterHeightOutsideDam = 1.0;
27 constexpr double BathymetryDryRing = 1.2;
29 for (int i = 0; i < NumberOfUnknowns + NumberOfAuxiliaryVariables; i++) {
33 Q[Shortcuts::h] = isInsideDam ? InitialWaterHeightInsideDam : InitialWaterHeightOutsideDam;
36 Q[Shortcuts::h] = 0.0; // Dry ring
39 Q[Shortcuts::z] = isDryRing ? BathymetryDryRing : 0.0;
43boundary_conditions =
"""
44 Qoutside[Shortcuts::h] = Qinside[Shortcuts::h];
45 Qoutside[Shortcuts::hu] = -Qinside[Shortcuts::hu];
46 Qoutside[Shortcuts::hv] = -Qinside[Shortcuts::hv];
47 Qoutside[Shortcuts::z] = Qinside[Shortcuts::z];
50refinement_criterion = (
53 return isInsideDam ? ::exahype2::RefinementCommand::Refine : ::exahype2::RefinementCommand::Keep;
60 return distanceFromOrigin < DamRadius * 2; // Everything outside the dam (includes the dry ring) shall be limited
64parser = exahype2.ArgumentParser()
69args = parser.parse_args()
72 "g": [9.81,
"double"],
73 "hThreshold": [1e-5,
"double"],
77max_h = 1.1 * min(size) / (3.0**args.min_depth)
78min_h = max_h * 3.0 ** (-args.amr_levels)
80aderdg_solver = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
82 order=args.degrees_of_freedom,
83 unknowns={
"h": 1,
"hu": 1,
"hv": 1,
"z": 1},
84 auxiliary_variables=0,
87 time_step_relaxation=0.5,
90aderdg_solver.set_implementation(
91 initial_conditions=initial_conditions,
92 boundary_conditions=boundary_conditions,
93 refinement_criterion=refinement_criterion,
94 flux=f
"ShallowWater::flux<double, Shortcuts, {aderdg_solver.unknowns}>(Q, x, h, t, dt, normal, F);",
95 max_eigenvalue=
"return ShallowWater::maxEigenvalue<double, Shortcuts>(Q, x, h, t, dt, normal);",
96 ncp=f
"ShallowWater::nonconservativeProduct<double, Shortcuts, {aderdg_solver.unknowns}>(Q, deltaQ, x, h, t, dt, normal, BTimesDeltaQ);",
99aderdg_solver.add_kernel_optimisations(
100 is_linear=
False, polynomials=exahype2.solvers.aderdg.Polynomials.Gauss_Legendre
102aderdg_solver.add_user_solver_includes(
108fv_solver = exahype2.solvers.fv.godunov.GlobalAdaptiveTimeStep(
110 patch_size=args.degrees_of_freedom * 2 + 1,
111 unknowns={
"h": 1,
"hu": 1,
"hv": 1},
112 auxiliary_variables={
"z": 1},
115 time_step_relaxation=0.5,
118fv_solver.set_implementation(
119 initial_conditions=initial_conditions,
120 boundary_conditions=boundary_conditions,
121 refinement_criterion=refinement_criterion,
122 riemann_solver=
"return hllemRiemannSolver<double, Shortcuts>(QL, QR, x, h, t, dt, normal, FL, FR);",
125fv_solver.add_user_solver_includes(
127#include "../HLLEMRiemannSolver.h"
131limiter_solver = exahype2.solvers.limiting.StaticLimiting(
132 name=
"LimiterSolver",
133 regular_solver=aderdg_solver,
134 limiting_solver=fv_solver,
135 physical_admissibility_criterion=limiting_criterion,
138project = exahype2.Project(
139 namespace=[
"applications",
"exahype2",
"ShallowWater"],
140 project_name=
"RadialDamBreak",
142 executable=
"ExaHyPE",
145project.add_solver(aderdg_solver)
146project.add_solver(fv_solver)
147project.add_solver(limiter_solver)
149if args.number_of_snapshots <= 0:
150 time_in_between_plots = 0.0
152 time_in_between_plots = args.end_time / args.number_of_snapshots
153 project.set_output_path(args.output)
155project.set_global_simulation_parameters(
159 min_end_time=args.end_time,
160 max_end_time=args.end_time,
161 first_plot_time_stamp=0.0,
162 time_in_between_plots=time_in_between_plots,
164 args.periodic_boundary_conditions_x,
165 args.periodic_boundary_conditions_y,
169project.set_load_balancer(
170 f
"new ::exahype2::LoadBalancingConfiguration({args.load_balancing_quality}, 1, {args.trees})"
172project.set_build_mode(mode=peano4.output.string_to_mode(args.build_mode))
173project = project.generate_Peano4_project(verbose=
False)
174for const_name, const_info
in constants.items():
175 const_val, const_type = const_info
176 project.constants.export_constexpr_with_type(const_name, str(const_val), const_type)
177project.build(make=
True, make_clean_first=
True, throw_away_data_after_build=
True)