Peano
Loading...
Searching...
No Matches
ccz4.py
Go to the documentation of this file.
1import os
2import argparse
3import dastgen2
4import shutil
5import numpy as np
6
7import peano4
8import exahype2
11
12
13from Probe_file_gene import tracer_seeds_generate
14from ComputeFirstDerivatives import ComputeFirstDerivativesFD4RK
15import CCZ4Helper
16
17
18
19modes = {
20 "release": peano4.output.CompileMode.Release,
21 "trace": peano4.output.CompileMode.Trace,
22 "assert": peano4.output.CompileMode.Asserts,
23 "stats": peano4.output.CompileMode.Stats,
24 "debug": peano4.output.CompileMode.Debug,
25}
26
27floatparams = {
28 "GLMc0":1.5, "GLMc":1.2, "GLMd":2.0, "GLMepsA":1.0, "GLMepsP":1.0,
29 "GLMepsD":1.0,
30 "itau":1.0, "k1":0.1, "k2":0.0, "k3":0.5, "eta":1.0,
31 "f":0.75, "g":0.0, "xi":1.0, "e":1.0, "c":1.0, "mu":0.2, "ds":1.0,
32 "sk":1.0, "bs":1.0,
33 "domain_r":0.5, "smoothing":0.0, "KOSigma":8.0 #, \
34}
35
36intparams = {"BBHType":2, "LapseType":1, "tp_grid_setup":0, "swi":99, "ReSwi":0, "SO":0}
37#
38if __name__ == "__main__":
39 parser = argparse.ArgumentParser(description='ExaHyPE 2 - CCZ4 script')
40 parser.add_argument("-maxh", "--max-h", dest="max_h", type=float, required="True", help="upper limit for refinement. Refers to volume/meshcell size, i.e. not to patch size" )
41 parser.add_argument("-minh", "--min-h", dest="min_h", type=float, default=0, help="lower limit for refinement (set to 0 to make it equal to max_h - default). Refers to volume/meshcell size, i.e. not to patch size" )
42 parser.add_argument("-ps", "--patch-size", dest="patch_size", type=int, default=6, help="Patch size, i.e. number of volumes per patch per direction" )
43 parser.add_argument("-plt", "--plot-step-size", dest="plot_step_size", type=float, default=0.04, help="Plot step size (0 to switch it off)" )
44 parser.add_argument("-m", "--mode", dest="mode", default="release", help="|".join(modes.keys()) )
45 parser.add_argument( "--gpu", dest="GPU", default=False, action="store_true", help="Run with accelerator support" )
46 parser.add_argument("-ext", "--extension", dest="extension", choices=["none", "adm", "Psi4"], default="none", help="Pick extension, i.e. what should be plotted on top of the evolving solution. Default is none" )
47 parser.add_argument("-impl", "--implementation", dest="implementation", choices=["fv-adaptive", "fd4-rk1-adaptive", "fd4-rk1-adaptive-enclave", "fd4-rk1-fixed", "fd4-rk4-adaptive", "fd4-rk2-adaptive", "RKDG"], required="True", help="Pick solver type" )
48 parser.add_argument("-no-pbc", "--no-periodic-boundary-conditions", dest="periodic_bc", action="store_false", default=True, help="switch on or off the periodic BC" )
49 parser.add_argument("-sommerfeld", "--sommerfeld-boundary-conditions", dest="sommerfeld_bc", action="store_true", default=False, help="switch on or off the Sommerfeld radiative BC" )
50 parser.add_argument("-et", "--end-time", dest="end_time", type=float, default=1.0, help="End (terminal) time" )
51 parser.add_argument("-pst", "--plot-start-time", dest="plot_start_time", type=float, default=0.0, help="start time for plot" )
52 parser.add_argument("-s", "--scenario", dest="scenario", choices=["gauge", "dia_gauge", "linear", "single-puncture","two-punctures", "flat"], required="True", help="Scenario" )
53 parser.add_argument("-cfl", "--CFL-ratio", dest="cfl", type=float, default=0.1, help="Set CFL ratio" )
54 parser.add_argument("-tracer", "--add-tracer", dest="add_tracer", type=int, default=0, help="Add tracers and specify the seeds. 0-switch off, 1-static point tracer, 2-moving point tracer" )
55 parser.add_argument("-tn", "--tracer-name", dest="tra_name", type=str, default="de", help="name of output tracer file (temporary)" )
56 parser.add_argument("-exn", "--exe-name", dest="exe_name", type=str, default="", help="name of output executable file" )
57 parser.add_argument("-outdir", "--output-directory", dest="path", type=str, default="./", help="specify the output directory, include the patch file and tracer file" )
58 parser.add_argument("-so", "--second-order", dest="SO_flag", default=False, action="store_true", help="enable double communication per timestep, used in the soccz4 formulation.")
59 parser.add_argument("-interp", "--interpolation", dest="interpolation", choices=["constant","order-2","linear-constant-extrap","linear-linear-extrap","linear-con-extrap-lin-normal-interp","linear-lin-extrap-lin-normal-interp", "matrix", "second_order"], default="linear-lin-extrap-lin-normal-interp", help="interpolation scheme for AMR" )
60 parser.add_argument("-restrict", "--restriction", dest="restriction", choices=["average", "inject", "matrix", "second_order" ], default="average", help="restriction scheme for AMR" )
61 parser.add_argument("-restart", "--restart-timestamp", dest="restart_timestamp", default=0.0, type=float, help="specify the timestamp you would like to restart. The first checkpointed timestamp will be used to restart the simulation. Default is 0.0 (switch off)" )
62 parser.add_argument("-checkdir", "--checkpoint-directory", dest="checkpoint_path", type=str, default="./", help="specify where the code read the checkpoint files FROM, default is the same directory of output above." )
63 parser.add_argument("-clt", "--checkpoint-step-size", dest="checkpoint_step_size", type=float, default=1.0, help="checkpoint step size (0 to switch it off)" )
64
65
66 for k, v in floatparams.items(): parser.add_argument("--{}".format(k), dest="CCZ4{}".format(k), type=float, default=v, help="default: %(default)s")
67 for k, v in intparams.items():
68 if k=="ReSwi":
69 parser.add_argument("--{}".format(k), dest="CCZ4{}".format(k), type=int, default=v, help="default: %(default)s, choose refinement criterion.")
70 else: parser.add_argument("--{}".format(k), dest="CCZ4{}".format(k), type=int, default=v, help="default: %(default)s")
71
72 args = parser.parse_args()
73
74 SuperClass = None
75
76 print(args.implementation)
77 if args.implementation=="fv-adaptive":
79 if args.implementation=="fd4-rk1-adaptive" or args.implementation=="fd4-rk4-adaptive" or args.implementation=="fd4-rk2-adaptive":
81 if args.implementation=="fd4-rk1-adaptive-enclave":
83 if args.implementation=="RKDG":
85
86
87 class CCZ4Solver( SuperClass ):
88 def __init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig):
89 unknowns = {
90 "G":6, #0-5
91 "K":6, #6-11
92 "theta":1, #12
93 "Z":3, #13-15
94 "lapse":1, #16
95 "shift":3, #17-19
96 "b":3, #20-22
97 "dLapse":3, #23-25
98 "dxShift":3,#26-28
99 "dyShift":3,#29-31
100 "dzShift":3,#32-34
101 "dxG":6, #35-40
102 "dyG":6, #41-46
103 "dzG":6, #47-52
104 "traceK":1, #53
105 "phi":1, #54
106 "P":3, #55-57
107 "K0":1, #58
108 }
109
110 number_of_unknowns = sum(unknowns.values())
111
113#include "../CCZ4Kernels.h"
114"""
116 SuperClass.__init__(
117 self,
118 name=name, patch_size=patch_size,
119 unknowns=number_of_unknowns,
120 auxiliary_variables=0,
121 min_volume_h=min_mesh_unit_h, max_volume_h=max_mesh_unit_h,
122 time_step_relaxation=cfl
123 )
125 if args.implementation=="fd4-rk1-adaptive":
126 rk_order = 1
127 elif args.implementation=="fd4-rk2-adaptive":
128 rk_order = 2
129 else:
130 rk_order = 4
131 SuperClass.__init__(
132 self,
133 name=name, patch_size=patch_size, rk_order=rk_order,
134 unknowns=number_of_unknowns,
135 auxiliary_variables=0,
136 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
137 time_step_relaxation=cfl,
138 KOSigma=KOSig,
139 reconstruction_with_rk=args.SO_flag
140 )
142 if args.implementation=="fd4-rk1-adaptive-enclave":
143 rk_order = 1
144 else:
145 rk_order = 4
146 SuperClass.__init__(
147 self,
148 name=name, patch_size=patch_size, rk_order=rk_order,
149 unknowns=number_of_unknowns,
150 auxiliary_variables=0,
151 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
152 time_step_relaxation=cfl,
153 KOSigma=KOSig,
154 pde_terms_without_state=True
155 )
156 else: # only rkdg left. i.e., SuperClass == exahype2.solvers.rkdg.rusanov.GlobalAdaptiveTimeStep:
157 SuperClass.__init__(
158 self,
159 name=name,
160 rk_order = 2,
162 face_projections = exahype2.solvers.rkdg.FaceProjections.Solution,
163 unknowns=number_of_unknowns,
164 auxiliary_variables=0,
165 min_cell_h=min_mesh_unit_h, max_cell_h=max_mesh_unit_h,
166 time_step_relaxation=cfl
167 )
168
169 self._patch_size = patch_size
170 self._domain_r = domain_r
171
172 self.set_implementation(
173 boundary_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
174 ncp=exahype2.solvers.PDETerms.User_Defined_Implementation,
175 flux=exahype2.solvers.PDETerms.None_Implementation,
176 source_term=exahype2.solvers.PDETerms.User_Defined_Implementation,
177 refinement_criterion = exahype2.solvers.PDETerms.User_Defined_Implementation,
178 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation
179 )
180
181 #self._compute_kernel_call = exahype2.solvers.rkfd.fd4.kernels.create_compute_kernel_for_FD4(
182 # self._flux_implementation,
183 # self._ncp_implementation,
184 # self._source_term_implementation,
185 # compute_max_eigenvalue_of_next_time_step = True,
186 # solver_variant = exahype2.solvers.rkfd.kernels.SolverVariant.Multicore,
187 # kernel_variant = exahype2.solvers.rkfd.kernels.KernelVariant.BatchedAoSHeap,
188 # KOSigma = self._KO_Sigma
189 # )
190
196 compute_max_eigenvalue_of_next_time_step = True,
197 solver_variant = exahype2.solvers.rkfd.kernels.SolverVariant.Multicore,
198 kernel_variant = exahype2.solvers.rkfd.kernels.KernelVariant.BatchedAoSHeap,
199 KOSigma = self._KO_Sigma
200 )
201
203 self.postprocess_updated_patch += """{
204 #if Dimensions==2
205 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
206 #endif
207
208 #if Dimensions==3
209 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
210 #endif
211
212 int index = 0;
213 for (int i=0;i<itmax;i++)
214 {
215 applications::exahype2::ccz4::enforceCCZ4constraints( newQ+index );
216 index += {{NUMBER_OF_UNKNOWNS}} + {{NUMBER_OF_AUXILIARY_VARIABLES}};
217 }
218 }
219"""
220
221
222
223
224 else:
226
228 SuperClass.create_action_sets(self)
229 self._action_set_couple_resolution_transitions_and_handle_dynamic_mesh_refinement.additional_includes += """
230#include "../CCZ4Kernels.h"
231 """
232
234 """
235 We take this routine to add a few additional include statements.
236 """
237 return SuperClass.get_user_action_set_includes(self) + self._my_user_includes
238
240 """
241 @add adm constriants (Hamilton and Momentum)
242 """
244
245 self._my_user_includes += """
246 #include "../CCZ4Kernels.h"
247 """
248
250 self._patch.dim[0], self._auxiliary_variables, args.SO_flag)
251
252 self.create_data_structures()
253 self.create_action_sets()
254
255 def add_Psi4W(self):
256 """
257 add psi4 writer
258 """
259 self._auxiliary_variables = 2
260
261 self._my_user_includes += """
262 #include "../libtwopunctures/TP_PunctureTracker.h"
263 #include "../CCZ4Kernels.h"
264 """
265
267 self._patch.dim[0], self._auxiliary_variables, args.SO_flag)
268
269 self.create_data_structures()
270 self.create_action_sets()
271
272
275 userinfo = []
276 exe="peano4"
277
278 if args.exe_name!="":
279 exe += "_"
280 exe += args.exe_name
281 if not args.tra_name=="de":
282 exe += "_" + args.tra_name
283 project = exahype2.Project( ["applications", "exahype2", "ccz4"], "ccz4", executable=exe)
284
285
288 is_aderdg = False
289 is_rkdg = False
290 solver_name = "CCZ4"
291 try:
292 if SuperClass==exahype2.solvers.aderdg.NonFusedGenericRusanovFixedTimeStepSize:
293 is_aderdg = True
294 order = 3
295 unknowns = 59
296 time_step_size = 0.001
297 except Exception as e:
298 pass
299 msg = "Warning: ADER-DG no supported on this machine"
300 print(msg)
301 userinfo.append((msg,e))
302
303 try:
305 is_rkdg = True
306 except Exception as e:
307 pass
308 msg = "Warning: RKDG not supported on this machine"
309 print(msg)
310 userinfo.append((msg,e))
311
312 if is_aderdg:
313 solver_name = "ADERDG" + solver_name
314 elif is_rkdg:
315 solver_name = "RKDG" + solver_name
316 else:
317 solver_name = solver_name
318
319 #if args.SO_flag==True:
320 # args.cfl=args.cfl/2
321
322 min_h = args.min_h
323 if min_h <=0.0:
324 print( "No minimal mesh size chosen. Set it to max mesh size (regular grid)" )
325 min_h = args.max_h
326
327 if is_aderdg:
328 my_solver = exahype2.solvers.aderdg.NonFusedGenericRusanovFixedTimeStepSize(
329 solver_name, order, unknowns, 0, #auxiliary_variables
330 exahype2.solvers.aderdg.Polynomials.Gauss_Legendre,
331 min_h, args.max_h, time_step_size,
332 flux = None,
333 ncp = exahype2.solvers.PDETerms.User_Defined_Implementation,
334 sources = exahype2.solvers.PDETerms.User_Defined_Implementation
335 )
336 else:
337 my_solver = CCZ4Solver(solver_name, args.patch_size, min_h, args.max_h, args.cfl, args.CCZ4domain_r,args.CCZ4KOSigma)
338 userinfo.append(("CFL ratio set as "+str(args.cfl), None))
339
340 userinfo.append(("The solver is "+args.implementation, None))
341
342
345
346 #Below are the I&R set functions for FD4
347 #These functions here do two things:
348 #1. it set the solver.interpolation parameters similar to what we do for fv, so the code know what template shoule be named.
349 #2. it computes and write the corresponding matrices for named schemes into the solver head files.
350 #notice point 2 is not needed as for build-in function (for fv) the matrices are already hard-coded.
351 tem_interp=["TP_constant","TP_linear_with_linear_extrap_normal_interp"]
352 tem_restrict=["TP_inject_normal_extrap","TP_average_normal_extrap"]
353 if ("fd4-rk" in args.implementation):
354 if args.interpolation == "matrix":
355 exahype2.solvers.rkfd.fd4.switch_to_FD4_matrix_interpolation( my_solver )
356 elif args.interpolation == "second_order":
357 exahype2.solvers.rkfd.fd4.switch_to_FD4_second_order_interpolation( my_solver )
358 else:
359 exahype2.solvers.rkfd.fd4.switch_to_FD4_tensor_product_interpolation( my_solver, tem_interp[1] )
360 userinfo.append(("FD4 Interpolation: " + tem_interp[1], None))
361
362 if args.restriction == "matrix":
363 exahype2.solvers.rkfd.fd4.switch_to_FD4_matrix_restriction( my_solver )
364 elif args.interpolation == "second_order":
365 exahype2.solvers.rkfd.fd4.switch_to_FD4_second_order_restriction( my_solver )
366 else:
367 exahype2.solvers.rkfd.fd4.switch_to_FD4_tensor_product_restriction( my_solver, tem_restrict[1] )
368 userinfo.append(("FD4 Restriction: " + tem_restrict[1], None))
369
370
373 if args.extension=="adm":
374 my_solver.add_adm_constriants()
375 if args.extension=="Psi4":
376 my_solver.add_Psi4W()
377
378
381 for k, v in intparams.items():
382 intparams.update({k:eval("args.CCZ4{}".format(k))})
383 for k, v in floatparams.items():
384 floatparams.update({k:eval("args.CCZ4{}".format(k))})
385
386 if args.SO_flag==True:
387 intparams.update({"SO":1})
388
389 if args.scenario=="two-punctures":
390 msg = "Periodic BC deactivated because you pick Puncture scenario\nInitialize binary black holes"
391 print(msg)
392 periodic_boundary_conditions = [False,False,False]
393 intparams.update({"swi":2}) #notice it may change, see according function in CCZ4.cpp
394 print(intparams)
395 userinfo.append((msg,None))
396 elif args.scenario=="single-puncture":
397 msg = "Periodic BC deactivated because you pick Puncture scenario\nInitialize single black hole"
398 print(msg)
399 periodic_boundary_conditions = [False,False,False]
400 intparams.update({"swi":0})
401 userinfo.append((msg,None))
402 elif args.periodic_bc==True:
403 msg = "Periodic BC set"
404 print(msg)
405 periodic_boundary_conditions = [True,True,True] # Periodic BC
406 userinfo.append((msg,None))
407 else:
408 msg = "WARNING: Periodic BC deactivated by hand"
409 print(msg)
410 periodic_boundary_conditions = [False,False,False]
411 userinfo.append((msg,None))
412
413 if args.sommerfeld_bc==True:
414 msg = "set Sommerfeld boundary condition"
415 userinfo.append((msg,None))
416 periodic_boundary_conditions = [False,False,False]
417 my_solver._action_set_handle_boundary.TemplateHandleBoundary_KernelCalls = CCZ4Helper.get_body_of_SommerfeldCondition(
418 args.scenario,
419 my_solver._unknowns,
420 my_solver._auxiliary_variables,
421 args.restart_timestamp)
422
423 solverconstants=""
424
425 if args.scenario=="gauge":
426 solverconstants+= "static constexpr int Scenario=0; /* Gauge wave */ \n "
427 userinfo.append(("picking gauge wave scenario",None))
428 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
429 intparams.update({"LapseType":0})
430 elif args.scenario=="dia_gauge":
431 solverconstants+= "static constexpr int Scenario=3; /* Diagonal Gauge wave */ \n "
432 userinfo.append(("picking diagonal gauge wave scenario",None))
433 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
434 intparams.update({"LapseType":0})
435 elif args.scenario=="linear":
436 solverconstants+= "static constexpr int Scenario=1; /* Linear wave */ \n "
437 userinfo.append(("picking linear wave scenario",None))
438 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
439 intparams.update({"LapseType":0})
440 elif args.scenario=="flat":
441 solverconstants+= "static constexpr int Scenario=4; /* flat spacetime */ \n "
442 userinfo.append(("picking flat scenario",None))
443 elif (args.scenario=="two-punctures") or (args.scenario=="single-puncture"):
444 solverconstants+= "static constexpr int Scenario=2; /* Two-puncture */ \n"
445 userinfo.append(("picking black hole scenario",None))
446 else:
447 raise Exception( "Scenario " + args.scenario + " is now unknown")
448
449 for k, v in floatparams.items(): solverconstants+= "static constexpr double {} = {};\n".format("CCZ4{}".format(k), v)
450 for k, v in intparams.items(): solverconstants+= "static constexpr int {} = {};\n".format("CCZ4{}".format(k), v)
451 my_solver.add_solver_constants(solverconstants)
452
453 project.add_solver(my_solver)
454
455 build_mode = modes[args.mode]
456
457 dimensions = 3
458
459
462 floatparams.update({"domain_r":args.CCZ4domain_r})
463 dr=floatparams["domain_r"]
464 offset=[-dr, -dr, -dr]; domain_size=[2*dr, 2*dr, 2*dr]
465 msg = "domain set as "+str(offset)+" and "+str(domain_size)
466 print(msg)
467 userinfo.append((msg,None))
468
469 project.set_global_simulation_parameters(
470 dimensions, # dimensions
471 offset, domain_size,
472 args.end_time, # end time
473 args.plot_start_time, args.plot_step_size, # snapshots
474 periodic_boundary_conditions,
475 8, # plotter precision
476 first_checkpoint_time_stamp=0,
477 time_in_between_checkpoints=args.checkpoint_step_size
478 )
479
480 if not args.restart_timestamp==0.0:
481 if not args.checkpoint_path=="./":
482 cpath=args.checkpoint_path
483 elif not args.path=="./":
484 cpath=args.path
485 else:
486 cpath="./"
487 project.set_restart_from_checkpoint(expected_restart_timestamp=args.restart_timestamp, checkpoint_path=cpath)
488
489 userinfo.append(("plot start time: "+str(args.plot_start_time)+", plot step size: "+str(args.plot_step_size),None))
490 userinfo.append(("Terminal time: "+str(args.end_time),None))
491
492 project.set_Peano4_installation("../../..", build_mode)
493
494
497 path="./"
498 if not args.path=="./":
499 path=args.path
500 #path="/cosma5/data/durham/dc-zhan3/bbh-c5-1"
501 #path="/cosma6/data/dp004/dc-zhan3/exahype2/sbh-fv3"
502 project.set_output_path(path)
503 if not os.path.exists(path):
504 os.makedirs(path)
505
506 probe_point = [-100, -100, 0.0]
507 project.add_plot_filter( probe_point,[200.0, 200.0, 0.01], 1 )
508 #if args.extension=="Psi4":
509 # my_solver.select_dofs_to_print = [0,12,16,17,18,53,54,59,60]
510 #elif args.extension=="adm" or args.extension=="phy-debug":
511 # pass
512 #else:
513 # pass#my_solver.select_dofs_to_print = [0,12,16,17,18,53,54]
514
515
516 #project.set_load_balancing("toolbox::loadbalancing::strategies::SpreadOut","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
517 project.set_load_balancing("toolbox::loadbalancing::strategies::SpreadOutHierarchically","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
518 #project.set_load_balancing("toolbox::loadbalancing::strategies::SpreadOutOnceGridStagnates","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
519 #project.set_load_balancing("toolbox::loadbalancing::strategies::SplitOversizedTree","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
520 #project.set_load_balancing("toolbox::loadbalancing::strategies::RecursiveBipartition","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
521 #project.set_load_balancing("toolbox::loadbalancing::strategies::cascade::SpreadOut_RecursiveBipartition","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
522 #project.set_load_balancing("toolbox::loadbalancing::strategies::cascade::SpreadOutOnceGridStagnates_SplitOversizedTree","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
523 #project.set_load_balancing("toolbox::loadbalancing::strategies::cascade::SpreadOutHierarchically_SpreadOutOnceGridStagnates","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
524 #project.set_load_balancing("toolbox::loadbalancing::strategies::cascade::SpreadOut_SplitOversizedTree",
525 # "new ::exahype2::LoadBalancingConfiguration(0.95), new toolbox::loadbalancing::metrics::CellCount()",)
526
527
530 if args.add_tracer==1:
531 tracer_particles = project.add_tracer( name="Tracer",attribute_count=59 )
533 # particle_set=tracer_particles, coordinates=[[0,0,8.0],[0,0,-8.0],[8.0,8.0,0],[-8.0,-8.0,0]])
534 particle_set=tracer_particles, coordinates=[[-0.1,0,0],[0.1,0,0],[0,0.1,0],[0,-0.1,0]])
535 #init_action_set = exahype2.tracer.InsertParticlesFromFile(
536 # particle_set=tracer_particles, filename="t-design.dat", scale_factor=abs(offset[0])*0.8)
537 #"Gauss_Legendre_quadrature.dat" #"t-design.dat"
538 init_action_set.descend_invocation_order = 0
539 project.add_action_set_to_initialisation( init_action_set )
540
541 tracer_action_set=exahype2.tracer.FiniteVolumesTracing(tracer_particles,
542 my_solver,
543 project_on_tracer_properties_kernel="::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear",
544 )
545 tracer_action_set.descend_invocation_order = my_solver._action_set_update_cell.descend_invocation_order+1
546 project.add_action_set_to_timestepping(tracer_action_set)
547 project.add_action_set_to_initialisation(tracer_action_set)
548
550 particle_set=tracer_particles,
551 solver=my_solver,
552 filename=args.path+"Tracer-test",
553 number_of_entries_between_two_db_flushes=1000,
554 output_precision=8,
555 data_delta_between_two_snapsots=1e16,
556 position_delta_between_two_snapsots=1e16,
557 time_delta_between_two_snapsots=0.02,
558 clear_database_after_flush = True
559 )
560 dump_action_set.descend_invocation_order = my_solver._action_set_update_cell.descend_invocation_order+2
561 project.add_action_set_to_timestepping(dump_action_set)
562
563 if args.add_tracer==2:
564 tracer_particles = project.add_tracer( name="Tracer",attribute_count=59 )
566 particle_set=tracer_particles, coordinates=[[0.2,0,0],[-0.2,0,0]])
567 init_action_set.descend_invocation_order = 0
568 project.add_action_set_to_initialisation( init_action_set )
569
570 tracer_action_set=exahype2.tracer.FiniteVolumesTracing(tracer_particles,
571 my_solver,
572 project_on_tracer_properties_kernel="::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear_explicit_Euler",
573 projection_kernel_arguments="""marker,
574 {{PATCH_SIZE}},
575 {{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}},
576 fineGridCell{{SOLVER_NAME}}Q.value,
577 fineGridCell{{SOLVER_NAME}}CellLabel.getTimeStepSize(),
578 {17,18,19},
579 {-1,-1,-1},
580 *p
581 """
582 )
583 tracer_action_set.descend_invocation_order = my_solver._action_set_compute_final_linear_combination.descend_invocation_order+1
584 project.add_action_set_to_timestepping(tracer_action_set)
585 project.add_action_set_to_initialisation(tracer_action_set)
586
588 particle_set=tracer_particles,
589 solver=my_solver,
590 filename=args.path+"Tracer-BHTracker",
591 number_of_entries_between_two_db_flushes=1000,
592 output_precision=8,
593 data_delta_between_two_snapsots=1e16,
594 position_delta_between_two_snapsots=1e16,
595 time_delta_between_two_snapsots=0.02,
596 clear_database_after_flush = True
597 )
598 dump_action_set.descend_invocation_order = my_solver._action_set_compute_final_linear_combination.descend_invocation_order+2
599 project.add_action_set_to_timestepping(dump_action_set)
600
601
604 peano4_project = project.generate_Peano4_project(verbose=True)
605
606 if args.scenario=="gauge" or args.scenario=="linear" or args.scenario=="dia_gauge" or args.scenario=="flat":
607 pass
608 elif args.scenario=="two-punctures" or args.scenario=="single-puncture":
609 #
610 # There are two different things to do when we pick a scneario: We have
611 # to configure the solver accordingly (and keep in mind that every solver
612 # needs its own config), and then we might have to adopt the build
613 # environment.
614 #
615 peano4_project.output.makefile.add_linker_flag( "-lm -lgsl -lgslcblas" )
616 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Utilities.cpp" )
617 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Parameters.cpp" )
618 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Logging.cpp" )
619 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TwoPunctures.cpp" )
620 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/CoordTransf.cpp" )
621 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/Equations.cpp" )
622 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/FuncAndJacobian.cpp" )
623 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/Newton.cpp" )
624 peano4_project.output.makefile.add_CXX_flag( "-DIncludeTwoPunctures" )
625 else:
626 raise Exception( "Scenario " + args.scenario + " is now unknown")
627
628 peano4_project.output.makefile.add_CXX_flag( "-DCCZ4EINSTEIN" )
629 peano4_project.output.makefile.add_cpp_file( "InitialValues.cpp" )
630 peano4_project.output.makefile.add_cpp_file( "CCZ4Kernels.cpp" )
631
632 if args.SO_flag==True:
633 userinfo.append(("Enable double communication, make sure you are using the Second formulism.", None))
634 additional_mesh_traversal = peano4.solversteps.Step( name = "AdditionalMeshTraversal",
635 add_user_defined_actions=False,
636 )
637 project_patch_onto_faces = exahype2.solvers.rkfd.actionsets.ProjectPatchOntoFaces(my_solver)
638 project_patch_onto_faces.guards = [ "false" for x in range(0,my_solver.number_of_Runge_Kutta_steps()+1) ]
639 project_patch_onto_faces.guards[-1] = my_solver._store_cell_data_default_guard()
640
641 roll_over_projected_faces = exahype2.solvers.rkfd.actionsets.RollOverUpdatedFace(my_solver,
642 my_solver._store_face_data_default_guard(),
643 )
644
646 solver=my_solver,
647 interpolation=my_solver.interpolation,
648 restriction=my_solver.restriction,
649 )
650
651 additional_mesh_traversal.add_action_set( ComputeFirstDerivativesFD4RK(solver=my_solver,
652 is_enclave_solver = ("enclave" in args.implementation),
653 ))
654 additional_mesh_traversal.add_action_set( project_patch_onto_faces )
655 additional_mesh_traversal.add_action_set( roll_over_projected_faces )
656 additional_mesh_traversal.add_action_set( dynamic_AMR )
657
658 #project.init_new_user_defined_algorithmic_step( additional_mesh_traversal )
659 #peano4_project.solversteps.add_step( additional_mesh_traversal )
660
661 #peano4_project.constants.define( "USE_ADDITIONAL_MESH_TRAVERSAL" )//maybe we need to change to InTimeStep scheme completely.
662
663 peano4_project.generate( throw_away_data_after_generation=False )
664 peano4_project.build( make_clean_first = True )
665
666 #Report the application information
667 userinfo.append(("the executable file name: "+exe, None))
668 userinfo.append(("output directory: "+path, None))
669 print("=========================================================")
670 if not args.add_tracer==0:
671 userinfo.append(("tracer output file: "+args.path+"Tracer-test", None))
672 if not args.restart_timestamp==0.0:
673 userinfo.append(("the code will restart from the first checkpoint after timestamp "+str(args.restart_timestamp), None))
674 if len(userinfo) >0:
675 print("The building information:")
676 for msg, exception in userinfo:
677 if exception is None:
678 print(msg)
679 else: print(msg, "Exception: {}".format(exception))
680 print(intparams)
681 print(floatparams)
682 print("=========================================================")
Explicit reconstruction of first derivatives for FD4 discretisation.
postprocess_updated_patch
Definition ccz4.py:263
get_user_action_set_includes(self)
We take this routine to add a few additional include statements.
Definition ccz4.py:233
_source_term_implementation
Definition ccz4.py:195
add_adm_constriants(self)
@add adm constriants (Hamilton and Momentum)
Definition ccz4.py:239
create_action_sets(self)
Definition ccz4.py:227
__init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig)
Definition ccz4.py:88
_preprocess_reconstructed_patch
Definition ccz4.py:249
add_Psi4W(self)
add psi4 writer
Definition ccz4.py:255
_fused_compute_kernel_call_cpu
Definition ccz4.py:192
ExaHyPE 2 project.
Definition Project.py:14
The Gauss-Legendre Basis is by construction the only basis which yields diagonal mass matrices.
RKDG solver with Rusanov Riemann solver employing global adaptive time stepping.
The handling of (dynamically) adaptive meshes for finite differences.
Definition DynamicAMR.py:11
Project patch data onto faces, so the faces hold valid data which can feed into the subsequent Runge-...
Particle tracing over the Finite Volumes solver.
This class assumes that you have an 2MxNxN patch on your faces.
Definition DynamicAMR.py:9
get_body_of_adm_constraints(patch_size, number_of_output_variable, so_flag)
Definition CCZ4Helper.py:21
get_body_of_SommerfeldCondition(scenario, unknowns, auxiliary_variables, restart_time=-1)
get_body_of_enforceCCZ4constraint()
Definition CCZ4Helper.py:1
get_body_of_Psi_Calc(patch_size, number_of_output_variable, so_flag)
Definition CCZ4Helper.py:97
create_compute_kernel_for_FD4(flux_implementation, ncp_implementation, source_implementation, compute_max_eigenvalue_of_next_time_step, solver_variant, kernel_variant, KOSigma)
I return only the unqualified function call, i.e.
Definition kernels.py:20