Peano
Loading...
Searching...
No Matches
radial-dam-break.py
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
3import os
4import sys
5
6import peano4
7import exahype2
8
9sys.path.insert(0, os.path.abspath(".."))
10from PDE import *
11from HLLEM import hllem
12
13define_radial_dam = """
14 constexpr double DAM_RADIUS = 1.0;
15
16 const double domainSizeHalfX = DomainSize[0] / 2.0;
17 const double domainSizeHalfY = DomainSize[1] / 2.0;
18
19 const double distanceFromOrigin = std::sqrt(
20 (x[0] - domainSizeHalfX) * (x[0] - domainSizeHalfX) +
21 (x[1] - domainSizeHalfY) * (x[1] - domainSizeHalfY)
22 );
23
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;
27"""
28
29initial_conditions = (
30 define_radial_dam
31 + """
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;
35
36 for (int i = 0; i < NumberOfUnknowns + NumberOfAuxiliaryVariables; i++) {
37 Q[i] = 0.0;
38 }
39
40 Q[Shortcuts::h] = isInsideDam ? INITIAL_WATER_HEIGHT_INSIDE_DAM : INITIAL_WATER_HEIGHT_OUTSIDE_DAM;
41
42 if (isDryRing) {
43 Q[Shortcuts::h] = 0.0; // Dry ring
44 }
45
46 Q[Shortcuts::z] = isDryRing ? BATHYMETRY_DRY_RING : 0.0;
47"""
48)
49
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];
55"""
56
57refinement_criterion = (
58 define_radial_dam
59 + """
60 return isInsideDam ? ::exahype2::RefinementCommand::Refine : ::exahype2::RefinementCommand::Keep;
61"""
62)
63
64limiting_criterion = (
65 define_radial_dam
66 + """
67 return distanceFromOrigin < DAM_RADIUS * 2; // Everything outside the dam (includes the dry ring) shall be limited
68"""
69)
70
71parser = exahype2.ArgumentParser()
72parser.set_defaults(
73 min_depth=4,
74 end_time=0.1,
75)
76args = parser.parse_args()
77
78constants = {
79 "g": [9.81, "double"],
80 "hThreshold": [1e-5, "double"],
81}
82
83size = [10.0, 10.0]
84max_h = 1.1 * min(size) / (3.0**args.min_depth)
85min_h = max_h * 3.0 ** (-args.amr_levels)
86
87aderdg_solver = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
88 name="ADERDGSolver",
89 order=args.degrees_of_freedom,
90 unknowns={"h": 1, "hu": 1, "hv": 1, "z": 1},
91 auxiliary_variables=0,
92 min_cell_h=min_h,
93 max_cell_h=max_h,
94 time_step_relaxation=0.5,
95)
96
97aderdg_solver.set_implementation(
98 initial_conditions=initial_conditions,
99 boundary_conditions=boundary_conditions,
100 refinement_criterion=refinement_criterion,
101 flux=flux,
102 ncp=nonconservative_product,
103 max_eigenvalue=eigenvalue
104 + """
105 return sFlux;
106""",
107)
108
109aderdg_solver.set_plotter(args.plotter)
110aderdg_solver.add_kernel_optimisations(
111 is_linear=False, polynomials=exahype2.solvers.aderdg.Polynomials.Gauss_Legendre
112)
113
114fv_solver = exahype2.solvers.fv.godunov.GlobalAdaptiveTimeStep(
115 name="FVSolver",
116 patch_size=args.degrees_of_freedom * 2 + 1,
117 unknowns={"h": 1, "hu": 1, "hv": 1},
118 auxiliary_variables={"z": 1},
119 min_volume_h=min_h,
120 max_volume_h=max_h,
121 time_step_relaxation=0.5,
122)
123
124fv_solver.set_implementation(
125 initial_conditions=initial_conditions,
126 boundary_conditions=boundary_conditions,
127 riemann_solver=hllem,
128)
129
130fv_solver.set_plotter(args.plotter)
131
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
137)
138
139project = exahype2.Project(
140 namespace=["applications", "exahype2", "swe"],
141 project_name="RadialDamBreak",
142 directory=".",
143 executable="ExaHyPE-ShallowWater",
144)
145project.add_solver(aderdg_solver)
146project.add_solver(fv_solver)
147project.add_solver(limiting_solver)
148
149if args.number_of_snapshots <= 0:
150 time_in_between_plots = 0.0
151else:
152 time_in_between_plots = args.end_time / args.number_of_snapshots
153 project.set_output_path(args.output)
154
155project.set_global_simulation_parameters(
156 dimensions=2,
157 size=size,
158 offset=[0.0, 0.0],
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,
163 periodic_BC=[
164 args.periodic_boundary_conditions_x,
165 args.periodic_boundary_conditions_y,
166 ],
167)
168
169project.set_load_balancer(
170 f"new ::exahype2::LoadBalancingConfiguration({args.load_balancing_quality}, 1, {args.trees}, {args.trees})"
171)
172project.set_Peano4_installation(
173 "../../../../", mode=peano4.output.string_to_mode(args.build_mode)
174)
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)