8 "release": peano4.api.output.CompileMode.RELEASE,
9 "trace": peano4.api.output.CompileMode.TRACE,
10 "assert": peano4.api.output.CompileMode.ASSERTS,
11 "stats": peano4.api.output.CompileMode.STATS,
12 "debug": peano4.api.output.CompileMode.DEBUG,
15parser = argparse.ArgumentParser(description=
'ExaHyPE 2 - Euler benchmarking script')
16parser.add_argument(
"-cs",
"--cell-size", dest=
"h", type=float, required=
True, help=
"Mesh size")
17parser.add_argument(
"-j",
"--parallel-builds", dest=
"j", type=int, default=-1, help=
"Parallel builds. Set to 0 to disable compile or to -1 to use all cores")
18parser.add_argument(
"-d",
"--dimensions", dest=
"dimensions", type=int, default=2, help=
"Dimensions")
19parser.add_argument(
"-m",
"--mode", dest=
"mode", default=
"release", help=
"|".join(modes.keys()))
20parser.add_argument(
"-et",
"--end-time", dest=
"end_time", type=float, default=1.0, help=
"Number of timesteps")
21parser.add_argument(
"-pd",
"--peano-dir", dest=
"peanodir", default=
"../../../../../", help=
"Peano4 directory")
22parser.add_argument(
"-cd",
"--configure-dir", dest=
"configuredir", default=
"../../../../../", help=
"Location of configure" )
23parser.add_argument(
"-amr",
"--adaptive-levels", dest=
"adaptivity_levels", type=int, default=0, help=
"Number of AMR grid levels on top of hmax (0 by default)")
24parser.add_argument(
"-t",
"--type", dest=
"type", choices=[
"global-fixed",
"global-adaptive"], required=
True)
25parser.add_argument(
"-pdt",
"--plot-dt", dest=
"plot_snapshot_interval", default=0, help=
"Time interval in-between two snapshots (switched off by default")
26parser.add_argument(
"-v",
"--verbose", dest=
"verbose", action=
"store_true", default=
False, help=
"Verbose")
27parser.add_argument(
"-ps",
"--patch-size", dest=
"patch_size", type=int, default=17, help=
"Dimensions")
28args = parser.parse_args()
30if args.dimensions
not in [2,3]:
31 print(
"Error, dimension must be 2 or 3, you supplied {}".format(args.dimensions))
35if args.mode
not in modes:
36 print(
"Error, mode must be {} or {}, you supplied {}".format(
", ",join(modes.keys()[:-1]),modes.keys()[-1],args.mode))
40print(
"\nConfiguring {}D Euler problem. Buildmode is {}, nbuilds={}.\n".format(args.dimensions, args.mode, args.j))
46project = exahype2.Project(
47 namespace = [
"applications",
"exahype2",
"euler",
"selfgravitation"],
48 project_name =
"Poisson",
50 executable =
"subcycling-scheme",
51 abstract_overwrite =
False,
57max_h = args.h / args.patch_size
58min_h = 0.9 * args.h * 3.0**(-args.adaptivity_levels) / args.patch_size
60time_step_size = 0.1 * min_h
62auxiliary_variables = 0
66if args.type==
"global-fixed":
67 euler_solver = exahype2.solvers.fv.rusanov.GlobalFixedTimeStep(
74 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
75 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
76 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
78 poisson_solver = exahype2.solvers.fv.rusanov.GlobalFixedTimeStep(
84 time_step_size / 4 / 3.1415**2,
85 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
86 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
87 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
89if args.type==
"global-adaptive":
90 euler_solver = exahype2.solvers.fv.rusanov.GlobalAdaptiveTimeStep(
96 time_step_relaxation = 1e-2,
97 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
98 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
99 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
101 poisson_solver = exahype2.solvers.fv.rusanov.GlobalAdaptiveTimeStep(
107 time_step_relaxation = 1e-3,
108 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
109 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
110 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
113euler_solver.set_implementation(refinement_criterion=exahype2.solvers.PDETerms.User_Defined_Implementation)
115project.add_solver(euler_solver)
116project.add_solver(poisson_solver)
122euler_solver._action_set_update_cell.guard +=
" and tarch::la::greaterEquals( fineGridCell" + \
123 poisson_solver.name +
"CellLabel.getTimeStamp(), fineGridCell" + euler_solver.name + \
124 "CellLabel.getTimeStamp() )"
129euler_solver.add_user_action_set_includes(
"""
130#include "toolbox/blockstructured/Copy.h"
132euler_solver.postprocess_updated_patch =
"""
133 ::toolbox::blockstructured::copyUnknown(
134 {}, // no of unknowns per dimension
135 fineGridCellEulerQ.value, // source
136 0, // the first index (0) is rho
137 5+3, // unknowns in source (incl material parameters)
138 0, // no overlap/halo here
139 fineGridCellPoissonQ.value, // dest
140 4, // index four in destination, i.e. fifth entry
141 4+1, // four unknowns in source (incl material parameters)
142 0 // no overlap/halo here
144""".format(args.patch_size)
146poisson_solver.add_user_action_set_includes(
"""
147#include "toolbox/blockstructured/Derivative.h"
149poisson_solver.postprocess_updated_patch =
"""
151 ::toolbox::blockstructured::computeGradientAndReturnMaxDifference(
152 {}, // no of unknowns per dimension
153 fineGridCellPoissonQ.value, // source
154 0, // take first entry of solution vector, ignore helper entries
155 4+1, // unknowns in source (incl material parameters)
156 0, // no overlap/halo here
157 fineGridCellEulerQ.value, // source
159 {{5,6}}, // indices to which we write the gradient. Depends on dimension
161 {{5,6,7}}, // and uses two brackets as escape symbol
163 5+3, // four unknowns in source (incl material parameters)
164 0, // no overlap/halo here
167 repositories::instanceOf{}.reportGradientDelta( delta );
168""".format(args.patch_size, poisson_solver.name)
173poisson_solver._compute_new_time_step_size +=
"""
174if (fineGridCell""" + poisson_solver.name +
"CellLabel.getTimeStamp() > fineGridCell" + euler_solver.name +
"""CellLabel.getTimeStamp() ) {
175 timeStamp = fineGridCell""" + euler_solver.name +
"""CellLabel.getTimeStamp(); // reset time step size
176 timeStepSize = 0.0; // invalidate time step size; the one chosen didn't make sense
177 fineGridCell""" + poisson_solver.name +
"""CellLabel.setTimeStamp( timeStamp );
183if args.dimensions == 2:
187 size = [1.0, 1.0, 1.0]
188 offset = [0.0, 0.0, 0.0]
193project.set_global_simulation_parameters(
194 dimensions = args.dimensions,
197 min_end_time = args.end_time,
198 max_end_time = args.end_time,
199 first_plot_time_stamp = 0.0,
200 time_in_between_plots = args.plot_snapshot_interval,
201 periodic_BC = [
False,
False,
False]
208project.set_load_balancing(
"toolbox::loadbalancing::strategies::RecursiveBipartition",
"new ::exahype2::LoadBalancingConfiguration()")
209project.set_Peano4_installation(args.peanodir, modes[args.mode])
210peano4_project = project.generate_Peano4_project(args.verbose)
211peano4_project.output.makefile.add_h_file(
"Euler.h")
212peano4_project.output.makefile.add_cpp_file(
"Euler.cpp")
213peano4_project.output.makefile.add_h_file(
"Poisson.h")
214peano4_project.output.makefile.add_cpp_file(
"Poisson.cpp")
215peano4_project.output.makefile.parse_configure_script_outcome(args.configuredir)
217 peano4_project.generate()
219 peano4_project.build(make_clean_first=
True, number_of_parallel_builds=args.j)
221print(
"Convert any output via pvpython ~/git/Peano/python/peano4/visualisation/render.py solution-Euler.peano-patch-file")