Peano
Loading...
Searching...
No Matches
convergence-study.py
Go to the documentation of this file.
1import os
2import argparse
3
4import peano4
5import exahype2
6import dastgen2
7
8import peano4.toolbox.particles
9import numpy as np
10
11# See comments in README.dox
12from CCZ4Solver import CCZ4Solver_FV_GlobalAdaptiveTimeStep
13from CCZ4Solver import CCZ4Solver_FV_GlobalAdaptiveTimeStepWithEnclaveTasking
14from CCZ4Solver import CCZ4Solver_FD4_GlobalAdaptiveTimeStep
15from CCZ4Solver import CCZ4Solver_FD4_GlobalAdaptiveTimeStepWithEnclaveTasking
16from CCZ4Solver import CCZ4Solver_RKDG_GlobalAdaptiveTimeStep
17from CCZ4Solver import CCZ4Solver_RKDG_GlobalAdaptiveTimeStepWithEnclaveTasking
18from CCZ4Solver import (
19 CCZ4Solver_FD4_SecondOrderFormulation_GlobalAdaptiveTimeStepWithEnclaveTasking,
20)
21
22from ComputeFirstDerivatives import ComputeFirstDerivativesFD4RK
23
24storage_types = {
25 "CallStack": exahype2.solvers.Storage.CallStack,
26 "Heap": exahype2.solvers.Storage.Heap,
27 "SmartPointers": exahype2.solvers.Storage.SmartPointers,
28}
29
30
31parser = argparse.ArgumentParser(
32 description="ExaHyPE 2 - CCZ4-GaugeWave benchmarking script"
33)
34parser.add_argument(
35 "-j", "--parallel-builds", dest="j", type=int, default=-1, help="Parallel builds"
36)
37parser.add_argument(
38 "-st",
39 "--storage",
40 dest="storage",
41 choices=storage_types.keys(),
42 required=True,
43 help="|".join(storage_types.keys()),
44)
45parser.add_argument(
46 "-pd",
47 "--peano-dir",
48 dest="peanodir",
49 default="../../../../",
50 help="Peano4 directory",
51)
52parser.add_argument(
53 "-v",
54 "--verbose",
55 dest="verbose",
56 action="store_true",
57 default=False,
58 help="Verbose",
59)
60parser.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)
87parser.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)
95parser.add_argument(
96 "-et",
97 "--end-time",
98 dest="end_time",
99 type=float,
100 default=1.0,
101 help="End of simulation",
102)
103parser.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)
111parser.add_argument("-m", "--mode", dest="mode", choices=peano4.output.CompileModes, default=peano4.output.CompileModes[0], help="|".join(peano4.output.CompileModes) )
112parser.add_argument(
113 "-tracer",
114 "--tracer",
115 dest="tracer",
116 action="store_true",
117 default=False,
118 help="Activate tracer",
119)
120
121args = parser.parse_args()
122
123project = 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#
136my_solver = None
137
138if 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 )
152if 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 )
166if "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
195if "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
224my_solver.switch_storage_scheme(
225 cell_data_storage=storage_types[args.storage],
226 face_data_storage=storage_types[args.storage],
227)
228
229
230assert my_solver != None
231
232my_solver.add_all_solver_constants()
233project.add_solver(my_solver)
234
235
238if 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
260if peano4.output.string_to_mode(args.mode)==peano4.output.CompileMode.Asserts:
261 delta_plot = 1.0 / 100
262else:
263 delta_plot = 1.0 / 20
264
265dimensions = 3
266offset = [-0.5, -0.5, -0.5]
267domain_size = [1, 1, 1]
268
269periodic_boundary_conditions = [True, True, True] # Periodic BC
270
271project.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
282probe_point = [-12,-12,0.0]
283project.add_plot_filter( probe_point,[24.0,24.0,0.01],1 )
284
285project.set_Peano4_installation(args.peanodir, peano4.output.string_to_mode(args.mode))
286
287peano4_project = project.generate_Peano4_project(verbose=args.verbose)
288
289if "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
321my_solver.add_makefile_parameters(
322 peano4_project, "../../../../applications/exahype2/ccz4"
323)
324
325peano4_project.generate(throw_away_data_after_generation=False)
326peano4_project.build(make_clean_first=True, number_of_parallel_builds=args.j)
CCZ4 solver using fourth-order finite differences and global adaptive time stepping incl enclave task...
CCZ4 solver using fourth-order finite differences and global adaptive time stepping without enclave t...
CCZ4 solver using finite volumes and global adaptive time stepping incl enclave tasking.
CCZ4 solver using finite volumes and global adaptive time stepping incl enclave tasking.
CCZ4 solver using Runge-Kutta Discontinuous Galerkin and global adaptive time stepping incl enclave t...
CCZ4 solver using Runge-Kutta Discontinuous Galerkin and global adaptive time stepping incl enclave t...
Explicit reconstruction of first derivatives for FD4 discretisation.