5sys.path.insert(0, os.path.abspath(
'../../../../python'))
13 "release": peano4.api.output.CompileMode.RELEASE,
14 "trace": peano4.api.output.CompileMode.TRACE,
15 "assert": peano4.api.output.CompileMode.ASSERTS,
16 "stats": peano4.api.output.CompileMode.STATS,
17 "debug": peano4.api.output.CompileMode.DEBUG,
21parser = argparse.ArgumentParser(description=
'Multigrid - Poisson solver')
22parser.add_argument(
"-j",
"--parallel-builds", dest=
"j", type=int, default=-1, help=
"Parallel builds. Set to 0 to disable compile or to -1 (default) to use all cores")
23parser.add_argument(
"-pt",
"--plot-timestep", dest=
"plot_each_timestep", action=
"store_true", default=
False, help=
"Plot after each timestep. By default (False) we plot after initialisation and at the end" )
24parser.add_argument(
"-pd",
"--peano-dir", dest=
"peanodir", default=
"../../../../../", help=
"Peano4 directory")
25parser.add_argument(
"-cd",
"--configure-dir", dest=
"configuredir", default=
"../../../../../", help=
"Location of configure" )
26parser.add_argument(
"-v",
"--verbose", dest=
"verbose", action=
"store_true", default=
True, help=
"Verbose")
27parser.add_argument(
"-d",
"--dimensions", dest=
"dimensions", type=int, default=2, help=
"Dimensions")
28parser.add_argument(
"-upv",
"--unknowns_per_vertex_dof", dest=
"upv", type=int, default=3, help=
"unknowns per vertex dof")
29parser.add_argument(
"-et",
"--end-time", dest=
"end_time", type=float, default=1.0, help=
"Number of timesteps")
30parser.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)")
31parser.add_argument(
"-t",
"--type", dest=
"type", choices=[
"global-fixed",
"global-adaptive"], required=
True)
32parser.add_argument(
"-pdt",
"--plot-dt", dest=
"plot_snapshot_interval", default=0, help=
"Time interval in-between two snapshots (switched off by default")
33parser.add_argument(
"-cs",
"--cell-size", dest=
"h", type=float, required=
True, help=
"Mesh size")
34parser.add_argument(
"-ps",
"--patch-size", dest=
"patch_size", type=int, default=17, help=
"Dimensions")
35parser.add_argument(
"-m",
"--mode", dest=
"mode", default=
"release", help=
"|".join(modes.keys()))
36parser.add_argument(
"-p",
"--poly_degree", dest=
"poly_degree", type=int, default=1, help=
"Polynomial Degree")
37parser.add_argument(
"-meshsize",
"--meshsize", dest=
"meshsize", default=0.3, help=
"Mesh size")
38parser.add_argument(
"-omega_c",
"--omega_c", dest=
"omega_c", default=0.5, help=
"Mesh size")
39parser.add_argument(
"-omega_f",
"--omega_f", dest=
"omega_f", default=1.0, help=
"Mesh size")
40args = parser.parse_args()
42if args.dimensions
not in [2,3]:
43 print(
"Error, dimension must be 2 or 3, you supplied {}".format(args.dimensions))
47if args.mode
not in modes:
48 print(
"Error, mode must be {} or {}, you supplied {}".format(
", ",join(modes.keys()[:-1]),modes.keys()[-1],args.mode))
52print(
"\nConfiguring {}D Euler problem. Buildmode is {}, nbuilds={}.\n".format(args.dimensions, args.mode, args.j))
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
75matrices = mghype.api.matrixgenerators.GLMatrixFree(
82assembly_matrix, assembly_matrix_scaling = matrices.get_cell_system_matrix_for_laplacian()
83mass_matrix, mass_matrix_scaling = matrices.get_cell_mass_matrix()
84face_from_cell_projection, \
85face_from_cell_projection_scaling = matrices.get_face_from_cell_matrix()
86cell_from_face_projection, \
87cell_from_face_projection_scaling = matrices.get_cell_from_face_matrix()
88approximate_system_matrix, \
89approximate_system_matrix_scaling = matrices.get_A_tilde()
100if args.type==
"global-fixed":
101 euler_solver = exahype2.solvers.fv.rusanov.GlobalFixedTimeStep(
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
112if args.type==
"global-adaptive":
113 euler_solver = exahype2.solvers.fv.rusanov.GlobalAdaptiveTimeStep(
119 time_step_relaxation = 1e-2,
120 flux = exahype2.solvers.PDETerms.User_Defined_Implementation,
121 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
122 source_term = exahype2.solvers.PDETerms.User_Defined_Implementation
139poisson_solver = mghype.matrixfree.solvers.api.DiscontinuousGalerkinDiscretisationPointWiseRiemannSolver(
141 dimensions = args.dimensions,
142 poly_degree = args.poly_degree,
143 unknowns_per_cell_node = 1,
144 solutions_per_face_node = 2,
145 projections_per_face_node = 2,
148 assembly_matrix= assembly_matrix,
149 assembly_matrix_scaling = assembly_matrix_scaling,
150 mass_matrix = mass_matrix,
151 mass_matrix_scaling = mass_matrix_scaling,
152 face_from_cell_projection = face_from_cell_projection,
153 face_from_cell_projection_scaling = face_from_cell_projection_scaling,
154 cell_from_face_projection = cell_from_face_projection,
155 cell_from_face_projection_scaling = cell_from_face_projection_scaling,
156 riemann_matrix = matrices.get_face_face_riemann_problem_matrix(),
157 boundary_matrix = matrices.get_boundary_matrix(),
158 cell_relaxation = args.omega_c,
159 face_relaxation = args.omega_f,
160 approximate_system_matrix = approximate_system_matrix,
161 approximate_system_matrix_scaling = approximate_system_matrix_scaling,
162 solver_tolerance = 0.01,
190 poisson_solver.name != euler_solver.name
191),
"names the solvers should not be the same"
193euler_solver.set_implementation(refinement_criterion=exahype2.solvers.PDETerms.User_Defined_Implementation)
199euler_project = exahype2.Project(
200 namespace = [
"applications",
"exahype2",
"euler",
"selfgravitation" ],
201 project_name =
"Euler",
203 subdirectory =
"euler",
204 executable =
"selfgravitation-euler"
216poisson_project = mghype.matrixfree.api.Project(
217 namespace = [
"applications",
"exahype2",
"euler",
"selfgravitation" ],
218 project_name =
"Poisson",
220 subdirectory =
"poisson",
221 executable =
"selfgravitation-poisson"
226euler_project.add_solver(euler_solver)
227poisson_project.add_solver(poisson_solver)
296if args.dimensions == 2:
300 size = [1.0, 1.0, 1.0]
301 offset = [0.0, 0.0, 0.0]
306euler_project.set_global_simulation_parameters(
307 dimensions = args.dimensions,
310 min_end_time = args.end_time,
311 max_end_time = args.end_time,
312 first_plot_time_stamp = 0.0,
313 time_in_between_plots = args.plot_snapshot_interval,
314 periodic_BC = [
False,
False,
False]
316poisson_project.set_global_simulation_parameters(
317 dimensions = args.dimensions,
320 plot_each_timestep = args.plot_each_timestep,
330euler_project.set_load_balancing(
"toolbox::loadbalancing::strategies::RecursiveBipartition",
"new ::exahype2::LoadBalancingConfiguration()")
331euler_project.set_Peano4_installation(args.peanodir, modes[args.mode])
332poisson_project.set_load_balancing(
"toolbox::loadbalancing::strategies::RecursiveSubdivision",
"new ::exahype2::LoadBalancingConfiguration()")
333poisson_project.set_Peano4_installation(args.peanodir, modes[args.mode])
346 project_name =
"EulerPoisson",
348 executable =
"selfgravitation-new",
350peano4_project.add_subproject(
351 euler_project.generate_Peano4_project(args.verbose),
353peano4_project.add_subproject(
354 poisson_project.generate_Peano4_project(args.verbose),
363peano4_project.output.makefile.parse_configure_script_outcome(args.configuredir)
364peano4_project.output.makefile.add_header_search_path(
"euler")
365peano4_project.output.makefile.add_header_search_path(
"poisson")
366peano4_project.output.makefile.add_h_file(
"""{}/{}.h""".format(euler_project.subdirectory, euler_solver.name))
367peano4_project.output.makefile.add_cpp_file(
"""{}/{}.cpp""".format(euler_project.subdirectory, euler_solver.name))
368peano4_project.output.makefile.add_h_file(
"""{}/{}.h""".format(poisson_project.subdirectory, poisson_solver.name))
369peano4_project.output.makefile.add_cpp_file(
"""{}/{}.cpp""".format(poisson_project.subdirectory, poisson_solver.name))
371 peano4_project.generate()
373 peano4_project.build(make_clean_first=
True, number_of_parallel_builds=args.j)
374print(
"EulerPoisson Peano4 Project built successfully")
Represents a Peano 4 project.