Peano
convergence-study.py
Go to the documentation of this file.
1 import os
2 import argparse
3 
4 import peano4
5 import exahype2
6 import dastgen2
7 
8 import peano4.toolbox.particles
9 import numpy as np
10 
11 # See comments in README.dox
12 from CCZ4Solver import CCZ4Solver_FV_GlobalAdaptiveTimeStep
13 from CCZ4Solver import CCZ4Solver_FV_GlobalAdaptiveTimeStepWithEnclaveTasking
14 from CCZ4Solver import CCZ4Solver_FD4_GlobalAdaptiveTimeStep
15 from CCZ4Solver import CCZ4Solver_FD4_GlobalAdaptiveTimeStepWithEnclaveTasking
16 from CCZ4Solver import CCZ4Solver_RKDG_GlobalAdaptiveTimeStep
17 from CCZ4Solver import CCZ4Solver_RKDG_GlobalAdaptiveTimeStepWithEnclaveTasking
18 from CCZ4Solver import (
19  CCZ4Solver_FD4_SecondOrderFormulation_GlobalAdaptiveTimeStepWithEnclaveTasking,
20 )
21 
22 from ComputeFirstDerivatives import ComputeFirstDerivativesFD4RK
23 
24 storage_types = {
25  "CallStack": exahype2.solvers.Storage.CallStack,
26  "Heap": exahype2.solvers.Storage.Heap,
27  "SmartPointers": exahype2.solvers.Storage.SmartPointers,
28 }
29 
30 
31 parser = argparse.ArgumentParser(
32  description="ExaHyPE 2 - CCZ4-GaugeWave benchmarking script"
33 )
34 parser.add_argument(
35  "-j", "--parallel-builds", dest="j", type=int, default=-1, help="Parallel builds"
36 )
37 parser.add_argument(
38  "-st",
39  "--storage",
40  dest="storage",
41  choices=storage_types.keys(),
42  required=True,
43  help="|".join(storage_types.keys()),
44 )
45 parser.add_argument(
46  "-pd",
47  "--peano-dir",
48  dest="peanodir",
49  default="../../../../",
50  help="Peano4 directory",
51 )
52 parser.add_argument(
53  "-v",
54  "--verbose",
55  dest="verbose",
56  action="store_true",
57  default=False,
58  help="Verbose",
59 )
60 parser.add_argument(
61  "-s",
62  "--solver",
63  dest="solver",
64  choices=[
65  "fv",
66  "fd4-rk1", "sofd4-rk1",
67  "fd4-rk2", "sofd4-rk2",
68  "fd4-rk3", "sofd4-rk3",
69  "fd4-rk4", "sofd4-rk4",
70  "dg0-rk1",
71  "dg0-rk2",
72  "dg0-rk3",
73  "dg0-rk4",
74  "dg1-rk1",
75  "dg2-rk1",
76  "dg2-rk2",
77  "dg3-rk1",
78  "dg3-rk3",
79  "dg4-rk4",
80  "dg4-rk1",
81  "dg4-rk2",
82  "dg4-rk3"
83  ],
84  required=True,
85  help="Pick solver type",
86 )
87 parser.add_argument(
88  "-enclave",
89  "--enclave",
90  dest="enclave",
91  action="store_true",
92  default=False,
93  help="switch on the enclave tasking solver",
94 )
95 parser.add_argument(
96  "-et",
97  "--end-time",
98  dest="end_time",
99  type=float,
100  default=1.0,
101  help="End of simulation",
102 )
103 parser.add_argument(
104  "-cs",
105  "--cell-size",
106  dest="cell_size",
107  type=float,
108  default=0.3,
109  help="Cell size (default 0.3)",
110 )
111 parser.add_argument("-m", "--mode", dest="mode", choices=peano4.output.CompileModes, default=peano4.output.CompileModes[0], help="|".join(peano4.output.CompileModes) )
112 parser.add_argument(
113  "-tracer",
114  "--tracer",
115  dest="tracer",
116  action="store_true",
117  default=False,
118  help="Activate tracer",
119 )
120 
121 args = parser.parse_args()
122 
123 project = exahype2.Project(
124  ["benchmarks", "exahype2", "ccz4"],
125  "ccz4",
126  executable=args.solver + "-" + str(args.cell_size),
127 )
128 
129 
130 #
131 # Create solver class
132 #
133 # For FV and FD schemes, I pick patches of 9x9x9 here, as I then can match stuff exactly
134 # with the DG solver of DG order 0. This helps me to debug stuff.
135 #
136 my_solver = None
137 
138 if args.solver == "fv" and args.enclave:
140  name="CCZ4FV",
141  patch_size=9,
142  min_volume_h=args.cell_size / 5,
143  max_volume_h=args.cell_size / 5,
144  pde_terms_without_state=True,
145  )
146  my_solver.set_implementation(
147  initial_conditions="""
148  for (int i=0; i<NumberOfUnknowns+NumberOfAuxiliaryVariables; i++) Q[i] = 0.0;
149  ::applications::exahype2::ccz4::gaugeWave(Q, volumeCentre, 0);
150  """
151  )
152 if args.solver == "fv" and not args.enclave:
154  name="CCZ4FV",
155  patch_size=9,
156  min_volume_h=args.cell_size / 5,
157  max_volume_h=args.cell_size / 5,
158  pde_terms_without_state=True,
159  )
160  my_solver.set_implementation(
161  initial_conditions="""
162  for (int i=0; i<NumberOfUnknowns+NumberOfAuxiliaryVariables; i++) Q[i] = 0.0;
163  ::applications::exahype2::ccz4::gaugeWave(Q, volumeCentre, 0);
164  """
165  )
166 if "fd4-rk" in args.solver or "sofd4-rk" in args.solver:
167  order = int(args.solver[-1])
168  second_order_formulation = "sofd4" in args.solver
169  if args.enclave==True:
171  name="CCZ4FD4RK" + str(order) + "Enclave",
172  patch_size=9,
173  rk_order=order,
174  min_meshcell_h=args.cell_size / 3,
175  max_meshcell_h=args.cell_size / 3,
176  second_order = second_order_formulation,
177  pde_terms_without_state=False
178  )
179  else:
181  name="CCZ4FD4RK" + str(order),
182  patch_size=9,
183  rk_order=order,
184  min_meshcell_h=args.cell_size / 3,
185  max_meshcell_h=args.cell_size / 3,
186  second_order = second_order_formulation
187  )
188  my_solver.set_implementation(
189  initial_conditions="""
190  for (int i=0; i<NumberOfUnknowns+NumberOfAuxiliaryVariables; i++) Q[i] = 0.0;
191  ::applications::exahype2::ccz4::gaugeWave(Q, meshCellCentre, 0);
192  """
193  )
194 
195 if "rk" in args.solver and "dg" in args.solver:
196  space_order = int(args.solver[2])
197  time_order = int(args.solver[6])
198  if args.enclave:
200  name="CCZ4DG" + str(space_order) + "RK" + str(time_order),
201  polynomials=exahype2.solvers.GaussLegendreBasis(space_order),
202  rk_order=time_order,
203  min_cell_h=args.cell_size * space_order,
204  max_cell_h=args.cell_size * space_order,
205  pde_terms_without_state=True,
206  )
207  else:
209  name="CCZ4DG" + str(space_order) + "RK" + str(time_order),
210  polynomials=exahype2.solvers.GaussLegendreBasis(space_order),
211  rk_order=time_order,
212  min_cell_h=args.cell_size * space_order,
213  max_cell_h=args.cell_size * space_order,
214  pde_terms_without_state=True,
215  )
216  my_solver.set_implementation(
217  initial_conditions="""
218  for (int i=0; i<NumberOfUnknowns+NumberOfAuxiliaryVariables; i++) Q[i] = 0.0;
219  ::applications::exahype2::ccz4::gaugeWave(Q, x, 0);
220  """
221  )
222 
223 
224 my_solver.switch_storage_scheme(
225  cell_data_storage=storage_types[args.storage],
226  face_data_storage=storage_types[args.storage],
227 )
228 
229 
230 assert my_solver != None
231 
232 my_solver.add_all_solver_constants()
233 project.add_solver(my_solver)
234 
235 
238 if args.tracer:
239  if peano4.output.string_to_mode(args.mode)==peano4.output.CompileMode.Asserts:
240  time_delta_between_two_snapsots = 1e-4
241  else:
242  time_delta_between_two_snapsots = 0.1
243  my_solver.add_tracer(
244  name="Tracer",
245  coordinates=[[0, 0, 0]],#coordinates=[[-0.4251, 0, 0], [0, 0, 0], [0.4251, 0, 0]],
246  project=project,
247  number_of_entries_between_two_db_flushes = 100,
248  data_delta_between_two_snapsots = 1e-8,
249  time_delta_between_two_snapsots = time_delta_between_two_snapsots,
250  clear_database_after_flush = False,
251  tracer_unknowns = None
252  )
253 
254 
255 
258 
259 
260 if peano4.output.string_to_mode(args.mode)==peano4.output.CompileMode.Asserts:
261  delta_plot = 1.0 / 100
262 else:
263  delta_plot = 1.0 / 20
264 
265 dimensions = 3
266 offset = [-0.5, -0.5, -0.5]
267 domain_size = [1, 1, 1]
268 
269 periodic_boundary_conditions = [True, True, True] # Periodic BC
270 
271 project.set_global_simulation_parameters(
272  dimensions, # dimensions
273  offset,
274  domain_size,
275  args.end_time,
276  0.0,
277  delta_plot,
278  periodic_boundary_conditions,
279  8, # plotter precision
280 )
281 
282 probe_point = [-12,-12,0.0]
283 project.add_plot_filter( probe_point,[24.0,24.0,0.01],1 )
284 
285 project.set_Peano4_installation(args.peanodir, peano4.output.string_to_mode(args.mode))
286 
287 peano4_project = project.generate_Peano4_project(verbose=args.verbose)
288 
289 if "sofd4" in args.solver:
290  additional_mesh_traversal = peano4.solversteps.Step( name = "AdditionalMeshTraversal",
291  add_user_defined_actions=False,
292  )
293 
294  #
295  # We misuse the projection. See @ref benchmarks_exahype2_ccz4_gauge_wave for details
296  #
297  project_patch_onto_faces = exahype2.solvers.rkfd.actionsets.ProjectPatchOntoFaces(my_solver)
298  project_patch_onto_faces.guards = [ "false" for x in range(0,my_solver.number_of_Runge_Kutta_steps()+1) ]
299  project_patch_onto_faces.guards[-1] = my_solver._store_cell_data_default_guard()
300 
301  roll_over_projected_faces = exahype2.solvers.rkfd.actionsets.RollOverUpdatedFace(my_solver,
302  my_solver._store_face_data_default_guard(),
303  )
304 
305  additional_mesh_traversal.add_action_set( ComputeFirstDerivativesFD4RK(solver=my_solver,
306  is_enclave_solver = args.enclave,
307  ))
308  additional_mesh_traversal.add_action_set( project_patch_onto_faces )
309  additional_mesh_traversal.add_action_set( roll_over_projected_faces )
310 
311  project.init_new_user_defined_algorithmic_step( additional_mesh_traversal )
312 
313  #
314  # Consult remarks in README.dox on the additional step and how it is
315  # integrated into the main routine.
316  #
317  peano4_project.solversteps.add_step( additional_mesh_traversal )
318  peano4_project.constants.define( "USE_ADDITIONAL_MESH_TRAVERSAL" )
319 
320 
321 my_solver.add_makefile_parameters(
322  peano4_project, "../../../../applications/exahype2/ccz4"
323 )
324 
325 peano4_project.generate(throw_away_data_after_generation=False)
326 peano4_project.build(make_clean_first=True, number_of_parallel_builds=args.j)
str
Definition: ccz4.py:55