6 project = exahype2.Project(
7 [
"tests",
"exahype2",
"aderdg"],
".", executable=
"ADERDG-Limiting"
10 parser = exahype2.ArgumentParser(
"ExaHyPE 2 - ADER-DG Limiting Testing Script")
15 args = parser.parse_args()
19 use_limiting = use_aderdg
and use_fv
23 order = args.degrees_of_freedom - 1
27 unknowns = {
"rho": 1,
"rhoU": 1,
"rhoV": 1,
"rhoE": 1}
30 size = [2.0, 2.0, 2.0][0:dimensions]
31 offset = [-1.0, -1.0, -1.0][0:dimensions]
32 max_h = 1.1 *
min(size) / (3.0**args.min_depth)
33 min_h = max_h / (3.0**args.amr_levels)
36 OriginalShockPosition = 0.111
39 initial_conditions = f
"""
40 constexpr double OriginalShockPosition = {OriginalShockPosition};
41 constexpr double Gamma = {Gamma};
42 const double p = (x[0] < -OriginalShockPosition && x[1] < -OriginalShockPosition) ? 0.1 : 1.0;
44 Q[0] = (x[0] < -OriginalShockPosition && x[1] < -OriginalShockPosition) ? 0.125 : 1.0;
47 Q[3] = p / (Gamma - 1.0);
50 boundary_conditions = f
"""
51 constexpr double OriginalShockPosition = {OriginalShockPosition};
52 constexpr double Gamma = {Gamma};
53 const double p = (x[0] < -OriginalShockPosition && x[1] < -OriginalShockPosition) ? 0.1 : 1.0;
55 Qoutside[0] = (x[0] < -OriginalShockPosition && x[1] < -OriginalShockPosition) ? 0.125 : 1.0;
58 Qoutside[3] = p / (Gamma - 1.0);
62 constexpr double Gamma = {Gamma};
63 constexpr double pZero = {pZero};
64 const double irho = Q[0] > 0.0 ? 1.0 / Q[0] : 0.0;
65 const double p = (Gamma - 1.0) * (Q[3] - 0.5 * irho * (Q[1]*Q[1]+Q[2]*Q[2]));
67 if (tarch::la::greater(p, pZero)) {{
69 F[1] = Q[normal + 1] * Q[1] * irho;
70 F[2] = Q[normal + 1] * Q[2] * irho;
71 F[3] = Q[normal + 1] * irho * (Q[3] + p);
82 constexpr double Gamma = {Gamma};
83 constexpr double pZero = {pZero};
84 const double irho = Q[0] > 0.0 ? 1.0 / Q[0] : 0.0;
85 const double p = (Gamma - 1.0) * (Q[3] - 0.5 * irho*(Q[1]*Q[1]+Q[2]*Q[2]));
87 if (tarch::la::greater(p, pZero)) {{
88 const double c = std::sqrt(Gamma * p * irho);
89 const double un = Q[normal + 1] * irho;
90 return std::fmax(std::fabs(un - c), std::fabs(un + c));
95 adjust_solution = f
"""
96 constexpr double pZero = {pZero};
97 constexpr double Gamma = {Gamma};
98 const double irho = Q[0] > 0.0 ? 1.0 / Q[0] : 0.0;
99 const double p = (Gamma - 1.0) * (Q[3] - 0.5 * irho * (Q[1]*Q[1]+Q[2]*Q[2]));
101 if (tarch::la::smaller(p, pZero)) {{
109 isPhysicallyAdmissible =
"return true;"
110 if with_limiting == 0:
111 isPhysicallyAdmissible =
"return true; //all ADERDG"
112 elif with_limiting == 1:
113 isPhysicallyAdmissible = f
"""
114 constexpr double Gamma = {Gamma};
115 constexpr double pZero = {pZero};
116 const double irho = Q[0] > 0.0 ? 1.0 / Q[0] : 0.0;
117 const double p = (Gamma - 1.0) * (Q[3] - 0.5 * irho * (Q[1]*Q[1]+Q[2]*Q[2]));
119 // Pressure, Density and Energy should be positive
120 if ((tarch::la::smaller(p, pZero)) // Pressure should be positive
121 or (Q[0] < 0.0) // Density should be positive
122 or (Q[3] < 0.0) // Energy should be positive
127 // Pressure, Density and Energy should be finite.
128 // If non-physical oscillations occur, the wave speed might receive a negative value under the square root.
129 // It results in eigenvalues becoming NaN, which are not marked as TROUBLED, if no isfinite check is performed.
130 for (int i = 0; i < {len(unknowns)}; ++i) {{
131 if (!std::isfinite(Q[i])) {{
139 isPhysicallyAdmissible =
"return false; //all FV"
142 aderdg_solver = exahype2.solvers.aderdg.GlobalAdaptiveTimeStep(
146 auxiliary_variables=auxiliary,
149 time_step_relaxation=CFL,
152 aderdg_solver.set_implementation(
154 max_eigenvalue=max_eval,
155 initial_conditions=initial_conditions,
156 boundary_conditions=boundary_conditions,
158 project.add_solver(aderdg_solver)
161 fv_solver = exahype2.solvers.fv.godunov.GlobalAdaptiveTimeStep(
163 patch_size=2 * order + 1,
165 auxiliary_variables=auxiliary,
168 time_step_relaxation=CFL,
170 fv_solver.set_implementation(
172 max_eigenvalue=max_eval,
173 initial_conditions=initial_conditions,
174 boundary_conditions=boundary_conditions,
175 adjust_solution=adjust_solution,
177 project.add_solver(fv_solver)
180 limiter = exahype2.solvers.limiting.PosterioriLimiting(
181 name=
"LimitingSolver",
182 regular_solver=aderdg_solver,
183 limiting_solver=fv_solver,
184 number_of_dmp_observables=len(unknowns),
185 dmp_relaxation_parameter=0.01,
186 dmp_differences_scaling=0.03,
187 physical_admissibility_criterion=isPhysicallyAdmissible,
189 project.add_solver(limiter)
191 project.set_output_path(
"solutions")
193 project.set_global_simulation_parameters(
194 dimensions=dimensions,
195 offset=offset[0:dimensions],
196 size=size[0:dimensions],
197 min_end_time=end_time,
198 max_end_time=end_time,
199 first_plot_time_stamp=0.0,
200 time_in_between_plots=plot_interval,
201 periodic_BC=[
False,
False,
False][0:dimensions],
204 project.set_load_balancer(
"new ::exahype2::LoadBalancingConfiguration")
205 project.set_Peano4_installation(
"../../../", mode=peano4.output.string_to_mode(args.build_mode))
206 project = project.generate_Peano4_project(verbose=
False)
207 project.set_fenv_handler(
True)
static double min(double const x, double const y)