9sys.path.insert(0, os.path.abspath(
".."))
11from HLLEM
import hllem
13define_radial_dam =
"""
14 constexpr double DAM_RADIUS = 1.0;
16 const double domainSizeHalfX = DomainSize[0] / 2.0;
17 const double domainSizeHalfY = DomainSize[1] / 2.0;
19 const double distanceFromOrigin = std::sqrt(
20 (x[0] - domainSizeHalfX) * (x[0] - domainSizeHalfX) +
21 (x[1] - domainSizeHalfY) * (x[1] - domainSizeHalfY)
24 const bool isInsideDam = distanceFromOrigin <= DAM_RADIUS;
25 const bool isOutsideDam = distanceFromOrigin > DAM_RADIUS;
26 const bool isDryRing = distanceFromOrigin >= 2 * DAM_RADIUS and distanceFromOrigin <= 3 * DAM_RADIUS;
32 constexpr double INITIAL_WATER_HEIGHT_INSIDE_DAM = 1.1;
33 constexpr double INITIAL_WATER_HEIGHT_OUTSIDE_DAM = 1.0;
34 constexpr double BATHYMETRY_DRY_RING = 1.2;
36 for (int i = 0; i < NumberOfUnknowns + NumberOfAuxiliaryVariables; i++) {
40 Q[Shortcuts::h] = isInsideDam ? INITIAL_WATER_HEIGHT_INSIDE_DAM : INITIAL_WATER_HEIGHT_OUTSIDE_DAM;
43 Q[Shortcuts::h] = 0.0; // Dry ring
46 Q[Shortcuts::z] = isDryRing ? BATHYMETRY_DRY_RING : 0.0;
50boundary_conditions =
"""
51 Qoutside[Shortcuts::h] = Qinside[Shortcuts::h];
52 Qoutside[Shortcuts::hu] = -Qinside[Shortcuts::hu];
53 Qoutside[Shortcuts::hv] = -Qinside[Shortcuts::hv];
54 Qoutside[Shortcuts::z] = Qinside[Shortcuts::z];
57refinement_criterion = (
60 return isInsideDam ? ::exahype2::RefinementCommand::Refine : ::exahype2::RefinementCommand::Keep;
67 return distanceFromOrigin < DAM_RADIUS * 2; // Everything outside the dam (includes the dry ring) shall be limited
71parser = exahype2.ArgumentParser()
76args = parser.parse_args()
79 "g": [9.81,
"double"],
80 "hThreshold": [1e-5,
"double"],
84max_h = 1.1 * min(size) / (3.0**args.min_depth)
85min_h = max_h * 3.0 ** (-args.amr_levels)
87aderdg_solver = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
89 order=args.degrees_of_freedom,
90 unknowns={
"h": 1,
"hu": 1,
"hv": 1,
"z": 1},
91 auxiliary_variables=0,
94 time_step_relaxation=0.5,
97aderdg_solver.set_implementation(
98 initial_conditions=initial_conditions,
99 boundary_conditions=boundary_conditions,
100 refinement_criterion=refinement_criterion,
102 ncp=nonconservative_product,
103 max_eigenvalue=eigenvalue
109aderdg_solver.set_plotter(args.plotter)
110aderdg_solver.add_kernel_optimisations(
111 is_linear=
False, polynomials=exahype2.solvers.aderdg.Polynomials.Gauss_Legendre
114fv_solver = exahype2.solvers.fv.godunov.GlobalAdaptiveTimeStep(
116 patch_size=args.degrees_of_freedom * 2 + 1,
117 unknowns={
"h": 1,
"hu": 1,
"hv": 1},
118 auxiliary_variables={
"z": 1},
121 time_step_relaxation=0.5,
124fv_solver.set_implementation(
125 initial_conditions=initial_conditions,
126 boundary_conditions=boundary_conditions,
127 riemann_solver=hllem,
130fv_solver.set_plotter(args.plotter)
132limiting_solver = exahype2.solvers.limiting.StaticLimiting(
133 name=
"LimitingSolver",
134 regular_solver=aderdg_solver,
135 limiting_solver=fv_solver,
136 physical_admissibility_criterion=limiting_criterion
139project = exahype2.Project(
140 namespace=[
"applications",
"exahype2",
"swe"],
141 project_name=
"RadialDamBreak",
143 executable=
"ExaHyPE-ShallowWater",
145project.add_solver(aderdg_solver)
146project.add_solver(fv_solver)
147project.add_solver(limiting_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}, {args.trees})"
172project.set_Peano4_installation(
173 "../../../../", mode=peano4.output.string_to_mode(args.build_mode)
175project = project.generate_Peano4_project(verbose=
False)
176for const_name, const_info
in constants.items():
177 const_val, const_type = const_info
178 project.constants.export_constexpr_with_type(const_name, str(const_val), const_type)
179project.set_fenv_handler(args.fpe)
180project.build(make=
True, make_clean_first=
True, throw_away_data_after_build=
True)