19 parser = argparse.ArgumentParser(description=
"SPH benchmarking script")
26 help=
"Parallel builds",
39 dest=
"clean_temporary_files",
41 help=
"Remove temporary directories and output files before script starts",
46 dest=
"particle_number",
49 help=
"Particle number (1D)",
57 help=
"Number of trees (subdomains) rank rank (0 uses all threads)",
65 help=
"End of simulation",
72 help=
"Executable file name",
80 help=
"Plot delta (0 switches off)",
88 help=
"Global timestep size (initial value)",
96 help=
"Value of the CFL constant",
100 "--particles-per-cell",
101 dest=
"particles_per_cell",
104 help=
"Particles per cell. If we have x particles, we will have 2^d*x particle comparisons on average per cell, as we compare to neighbouring half cells as well",
110 default=
"../../../..",
111 help=
"Peano4 directory",
117 choices=[
"release",
"stats",
"trace",
"asserts",
"debug"],
119 help=
"Pick build type",
125 default=
"domain-decomposition.scattered.multiscale-sorting.no-optimisation",
126 help=
"Realisation to use. See Peano/src/exaparty/api/ProjectRealisation.py for options",
131 dest=
"mantissa_size",
134 help=
"Mantissa size for clang truncation (if supported by compiler). Default of 0 disables any compression",
141 default=
"quartic_spline",
142 choices=sphtools.sph_kernel_list,
143 help=
"SPH kernel function to use.",
146 return parser.parse_args()
149if __name__ ==
"__main__":
156project_namespace = [
"benchmarks",
"exaparty",
"noh2D"]
159 namespace=project_namespace, project_name=
"Noh2D", executable=args.output_file
171particles_per_cell = args.particles_per_cell
172total_number_of_particles = args.particle_number**hydro_dimensions
173total_number_of_cells = total_number_of_particles / particles_per_cell
174cells_per_dimension = total_number_of_cells ** (1.0 / hydro_dimensions)
175max_cell_size = 2.0 / cells_per_dimension * 3.0
178 "{} particles in total fit into {} cells, i.e. {} cells per dimension. This gives h={}".format(
179 total_number_of_particles,
180 total_number_of_cells,
188 dimensions_hydro=hydro_dimensions,
189 cfl_factor=args.cfl_factor,
190 initial_time_step_size=args.timestep_size,
191 constant_time_step_size=
True,
192 exaparty_project_namespace=project_namespace,
193 particles_per_cell=particles_per_cell,
206domain_size = [2, 2, 2]
207periodic_boundary_conditions = [
False,
False,
False]
210HYDRO_DIMENSIONS = hydro_dimensions
213HYDRO_PART_NUMBER = args.particle_number
216GLOBAL_TIME_STEP_SIZE = args.timestep_size
217CFL_CONSTANT = args.cfl_factor
220gamma_hydro_list = [str(5 / 3), str(7 / 5), str(4 / 3), str(2 / 1)]
221gamma_hydro_list_symbols = [
227GAMMA = gamma_hydro_list[0]
228GAMMA_HYDRO_SYMBOL = gamma_hydro_list_symbols[0]
233KERNEL_SYMBOL = sphtools.sph_kernel_macro_name[kernel]
234KERNEL_SUPPORT_RAD = sphtools.sph_kernel_H_over_h[HYDRO_DIMENSIONS - 1][kernel]
236hydro_H_max = max_cell_size / 2
238dx = domain_size[0] / args.particle_number
239if hydro_H_max < 3.0 * dx:
240 raise ValueError(
"Too small hydro_H_max", 3.0 * dx, hydro_H_max)
241hydro_h_max = exaparty.api.sphtools.sph_kernel_get_smoothing_length_from_interaction_radius(
242 hydro_H_max, kernel, hydro_dimensions
244particle.h_hydro_max = hydro_h_max
255if args.mantissa_size > 0:
256 particle.mass.valid_mantissa_bits = args.mantissa_size
257 particle.velocity.valid_mantissa_bits = args.mantissa_size
258 particle.acceleration.valid_mantissa_bits = args.mantissa_size
259 particle.density.valid_mantissa_bits = args.mantissa_size
260 particle.pressure.valid_mantissa_bits = args.mantissa_size
261 particle.smoothL.valid_mantissa_bits = args.mantissa_size
262 particle.u.valid_mantissa_bits = args.mantissa_size
263 particle.uDot.valid_mantissa_bits = args.mantissa_size
264 particle.f.valid_mantissa_bits = args.mantissa_size
265 particle.wcount_dh.valid_mantissa_bits = args.mantissa_size
266 particle.rho_dh.valid_mantissa_bits = args.mantissa_size
267 particle.hleft.valid_mantissa_bits = args.mantissa_size
268 particle.hright.valid_mantissa_bits = args.mantissa_size
269 particle.smoothL_prev.valid_mantissa_bits = args.mantissa_size
270 particle.wcount.valid_mantissa_bits = args.mantissa_size
271 particle.hDot.valid_mantissa_bits = args.mantissa_size
272 particle.residual.valid_mantissa_bits = args.mantissa_size
273 particle.balsara.valid_mantissa_bits = args.mantissa_size
274 particle.rot_v.valid_mantissa_bits = args.mantissa_size
275 particle.div_v.valid_mantissa_bits = args.mantissa_size
276 particle.v_sig_AV.valid_mantissa_bits = args.mantissa_size
277 particle.soundSpeed.valid_mantissa_bits = args.mantissa_size
278 particle.v_full.valid_mantissa_bits = args.mantissa_size
279 particle.u_full.valid_mantissa_bits = args.mantissa_size
281particle.data.expose_all_attributes_in_header_file()
286particle.set_parameters()
291particle_set = project.add_particle_species(particle)
293if args.mode ==
"release":
294 build_mode = peano4.api.output.CompileMode.RELEASE
295if args.mode ==
"stats":
296 build_mode = peano4.api.output.CompileMode.STATS
297if args.mode ==
"asserts":
298 build_mode = peano4.api.output.CompileMode.ASSERTS
299if args.mode ==
"trace":
300 build_mode = peano4.api.output.CompileMode.TRACE
301if args.mode ==
"debug":
302 build_mode = peano4.api.output.CompileMode.DEBUG
305project.set_global_simulation_parameters(
306 dimensions=dimensions,
308 domain_size=domain_size,
309 min_end_time=args.end_time,
311 first_plot_time_stamp=0.0,
312 time_in_between_plots=args.plot_delta,
313 periodic_BC=periodic_boundary_conditions,
318realisation = args.realisation.split(
".")
319parallelisation = realisation[0]
320storage = realisation[1]
321sorting = realisation[2]
322kernel_optimisation = realisation[3]
324project.set_realisation(
325 parallelisation=parallelisation,
328 kernel_optimisation=kernel_optimisation,
331project.set_Peano4_installation(args.peanodir, build_mode)
333project.set_load_balancing(
334 "toolbox::loadbalancing::strategies::SpreadOutOnceGridStagnates",
335 f
"new toolbox::loadbalancing::DefaultConfiguration({args.trees})",
350initialisation_snippet = ICs.initialisation_snippet
352project.algorithm_step_initial_conditions.add_action_set(
354 particle_set=particle_set,
355 initialisation_call=initialisation_snippet,
356 distance_between_particles_along_one_axis=(
357 domain_size[0] / (args.particle_number)
359 additional_includes=
"""
360#include "exaparty/kernels/legacy/equation_of_state.h"
361#include "exaparty/kernels/legacy/kernel_hydro.h"
392 "globaldata::{}::getSpecies().getMinTimeStamp()".format(particle.name),
394particle_plotter.add_attribute_to_plot(particle.velocity, dimensions)
395particle_plotter.add_attribute_to_plot(particle.acceleration, dimensions)
396particle_plotter.add_attribute_to_plot(particle.mass, 1)
397particle_plotter.add_attribute_to_plot(particle.density, 1)
398particle_plotter.add_attribute_to_plot(particle.pressure, 1)
399particle_plotter.add_attribute_to_plot(particle.u, 1)
400particle_plotter.add_attribute_to_plot(particle.smoothL, 1)
401if args.mode ==
"asserts" or args.mode ==
"debug":
402 particle_plotter.add_attribute_to_plot(particle.partid, 1)
403 particle_plotter.add_attribute_to_plot(particle.density_neighbourcount, 1)
404 particle_plotter.add_attribute_to_plot(particle.force_neighbourcount, 1)
405project.algorithm_step_plot.add_action_set(particle_plotter)
420peano4_project = project.generate_Peano4_project(verbose=args.verbose)
423if GAMMA
not in gamma_hydro_list:
424 print(f
"Please check the value of GAMMA. You have chosen: {GAMMA}")
426print(
"-----------------------------------------------------------------------")
427print(
"SPH parameters summary:")
428print(f
"Effective dimensions of the Simulation: {HYDRO_DIMENSIONS}")
429print(f
"Global time-step size: {GLOBAL_TIME_STEP_SIZE}")
430print(f
"Number of particles (1D): {HYDRO_PART_NUMBER}")
431print(f
"Adiabatic index: {GAMMA}")
432print(f
"Smoothing length free factor: {particle.eta_factor}")
433print(
"-----------------------------------------------------------------------")
437peano4_project.constants.export_const_with_type(
438 "HYDRO_DIMENSIONS", str(HYDRO_DIMENSIONS),
"double"
440peano4_project.constants.export_const_with_type(
441 "HYDRO_PART_NUMBER", str(HYDRO_PART_NUMBER),
"double"
443peano4_project.constants.export_const_with_type(
444 "GLOBAL_TIME_STEP_SIZE", str(GLOBAL_TIME_STEP_SIZE),
"double"
446peano4_project.constants.export_const_with_type(
"GAMMA", GAMMA,
"double")
449peano4_project.output.makefile.add_CXX_flag(
450 "-D" +
"HYDRO_DIMENSION=" + str(HYDRO_DIMENSIONS)
452peano4_project.output.makefile.add_CXX_flag(
"-D" + GAMMA_HYDRO_SYMBOL)
453peano4_project.output.makefile.add_CXX_flag(
"-D" + KERNEL_SYMBOL)
460if args.clean_temporary_files:
461 dirs = [
"vertexdata/",
"repositories/",
"globaldata/",
"observers/"]
467peano4_project.generate(
468 overwrite=peano4.api.output.Overwrite.Always, throw_away_data_after_generation=
True
470peano4_project.build(make_clean_first=
True, number_of_parallel_builds=args.j)
472if args.clean_temporary_files:
476 for f
in os.listdir(
".")
477 if f.endswith(
".peano-patch-file")
or f.endswith(
".vtu")
or f.endswith(
".pvd")
479 for f
in output_files:
Initialisation snippet for the Noh problem in different spatial dimensions.
For constructor's time_stamp_evaluation argument.
parse_args()
Parse user input.