Peano
coupling.py
Go to the documentation of this file.
1 import peano4, exahype2
2 import os, sys
3 import argparse
4 import subprocess
5 import mpmath as mp
6 
7 sys.path.insert(0, os.path.abspath("../aderdg/"))
8 sys.path.insert(0, os.path.abspath("../aderdg/scenarios"))
9 import scenarios
10 
11 modes = {
12  "release": peano4.output.CompileMode.Release,
13  "trace": peano4.output.CompileMode.Trace,
14  "assert": peano4.output.CompileMode.Asserts,
15  "stats": peano4.output.CompileMode.Stats,
16  "debug": peano4.output.CompileMode.Debug,
17 }
18 
19 available_prec = {
20  "bf16", "fp16", "fp32", "fp64"
21 }
22 
23 available_scenarios = {
24  "AcousticPlanarWaves": scenarios.AcousticPlanarWaves(dimensions=2),
25  "AdvectionLinear": scenarios.AdvectionLinear(),
26  "ElasticPlanarWaves": scenarios.ElasticPlanarWaves(dimensions=2),
27  "EulerGaussianBell": scenarios.EulerGaussianBell(),
28  "EulerIsotropicVortex": scenarios.EulerIsotropicVortex(),
29  "SWERadialDamBreak": scenarios.SWERadialDamBreak(),
30  "SWERestingLake": scenarios.SWERestingLake(),
31 }
32 
33 parser = argparse.ArgumentParser(description="ExaHyPE 2 - ADER testing script")
34 
35 parser.add_argument(
36  "-md",
37  "--mesh-depth",
38  dest="md",
39  type=int,
40  default=3,
41  help="Depth of coarsest mesh level, i.e if 2 is specified there will be 9 cells per dimension",
42 )
43 parser.add_argument(
44  "-amr",
45  "--adaptive-levels",
46  dest="adaptivity_levels",
47  type=int,
48  default=0,
49  help="Number of AMR grid levels on top of hmax (0 by default)",
50 )
51 parser.add_argument("-o", "--order", dest="order", type=int, default=3, help="DG Order")
52 parser.add_argument(
53  "-p",
54  "--p",
55  dest="polynomials",
56  type=int,
57  default=0,
58  help="Polynomial type, 0 is Gauss-Legendre, 1 is Gauss-Lobatto",
59 )
60 parser.add_argument(
61  "-m", "--mode", dest="mode", default="release", help="|".join(modes.keys())
62 )
63 parser.add_argument(
64  "-pr", "--precision", dest="precision", default="fp64", help="|".join(available_prec)
65 )
66 parser.add_argument(
67  "-s",
68  "--scenario",
69  dest="s",
70  default="SWERadialDamBreak",
71  help="|".join(available_scenarios.keys()),
72 )
73 
74 args = parser.parse_args()
75 
76 if args.s is None:
77  while True:
78  try:
79  s = input(
80  "Which of the following scenarios would you like to try out?\n"
81  + " - ".join(available_scenarios.keys())
82  + "\n"
83  )
84  scenario = available_scenarios[s]
85  except KeyError:
86  continue
87  else:
88  # User has specified a valid scenario
89  break
90 else:
91  scenario = available_scenarios[args.s]
92 
93 order = args.order
94 max_h = 1.1 * scenario._domain_size / (3.0**args.md)
95 min_h = max_h * 3.0 ** (-args.adaptivity_levels)
96 
97 polynomials = (
98  exahype2.solvers.aderdg.Polynomials.Gauss_Legendre
99  if args.polynomials == 0
100  else exahype2.solvers.aderdg.Polynomials.Gauss_Lobatto
101 )
102 
103 project = exahype2.Project(
104  ["tests", "exahype2", "aderdg"],
105  ".",
106  executable=scenario.__class__.__name__,
107 )
108 
109 solver = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
110  name=scenario.__class__.__name__,
111  order=order,
112  min_cell_h=min_h,
113  max_cell_h=max_h,
114  time_step_relaxation=0.9,
115  unknowns=scenario._equation.num_unknowns,
116  auxiliary_variables=scenario._equation.num_auxiliary_variables
117 )
118 
119 solver.add_kernel_optimisations(
120  polynomials=polynomials, is_linear=scenario._equation.is_linear,
121  riemann_solver_implementation = scenario._equation.riemann_solver(),
122  precision = args.precision
123 )
124 
125 solver.set_implementation(
126  initial_conditions=scenario.initial_conditions(),
127  boundary_conditions=scenario.boundary_conditions(),
128  eigenvalues=scenario._equation.eigenvalues(),
129  flux=scenario._equation.flux(),
130  ncp=scenario._equation.ncp(),
131 )
132 
133 if scenario.analytical_solution() != exahype2.solvers.PDETerms.None_Implementation:
134  exahype2.solvers.aderdg.ErrorMeasurement(
135  solver,
136  error_measurement_implementation=scenario.analytical_solution(),
137  output_file_name="Error_" + scenario.__class__.__name__,
138  )
139 
140 project.add_solver(solver)
141 
142 
143 
144 solver2 = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
145  name=scenario.__class__.__name__+"2",
146  order=order,
147  min_cell_h=min_h,
148  max_cell_h=max_h,
149  time_step_relaxation=0.9,
150  unknowns=scenario._equation.num_unknowns,
151  auxiliary_variables=scenario._equation.num_auxiliary_variables
152 )
153 
154 solver2.add_kernel_optimisations(
155  polynomials=polynomials, is_linear=scenario._equation.is_linear,
156  riemann_solver_implementation = scenario._equation.riemann_solver(),
157  precision = "fp32"#precision = args.precision
158 )
159 
160 solver2.set_implementation(
161  initial_conditions=scenario.initial_conditions(),
162  boundary_conditions=scenario.boundary_conditions(),
163  eigenvalues=scenario._equation.eigenvalues(),
164  flux=scenario._equation.flux(),
165  ncp=scenario._equation.ncp(),
166 )
167 
168 
169 
170 if scenario.analytical_solution() != exahype2.solvers.PDETerms.None_Implementation:
171  exahype2.solvers.aderdg.ErrorMeasurement(
172  solver2,
173  error_measurement_implementation=scenario.analytical_solution(),
174  output_file_name="Error_" + scenario.__class__.__name__,
175  )
176 
177 project.add_solver(solver2)
178 
179 # from fuseADERSolvers import fuseADERSolvers
180 # fuseADERSolvers(solver, solver2, "marker.x()[0]<=0.0")
181 
182 sys.path.insert(0, os.path.abspath("./coupling"))
183 from coupling import StaticCoupling
184 
185 limiter = StaticCoupling(
186  name = "limitingSolver",
187  regularSolver = solver,
188  limitingSolver = solver2,
189  limiting_criterion_implementation = """
190  return x[0]<=0.0;
191 """
192 )
193 project.add_solver(limiter)
194 
195 
196 
197 
198 project.set_output_path("solutions")
199 scenario.set_global_simulation_parameters(project)
200 
201 project.set_load_balancing(
202  "toolbox::loadbalancing::strategies::SpreadOutOnceGridStagnates",
203  "new ::exahype2::LoadBalancingConfiguration(0.98)",
204 )
205 project.set_Peano4_installation("../../../", modes[args.mode])
206 project = project.generate_Peano4_project("False")
207 project.set_fenv_handler("FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW")
208 
209 project.build(make_clean_first=True)
210 
211 print(args)
212 print(solver)
213 print(project)
Scenario reproduced from Dumbser & Käser, https://doi.org/10.1111/j.1365-246X.2006....
Very simple scenario in which the initial value of x is shifted in each spatial dimension.
Scenario reproduced from Dumbser & Käser, https://doi.org/10.1111/j.1365-246X.2006....
Scenario reproduced from Ioratti, Dumbser & Loubère, https://doi.org/10.1007/s10915-020-01209-w (p.
Scenario reproduced from Ioratti, Dumbser & Loubère, https://doi.org/10.1007/s10915-020-01209-w (p.
Classic radial dam break SWE equations, with constant initial water height but a bump in the bathymet...
Resting lake scenario for the shallow water equations.