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", "fd4-rk1-dsl", "fd4-rk2-dsl", "fd4-rk4-dsl", "fd4-rk1-dsl-enclave", "fd4-rk2-dsl-enclave", "fd4-rk4-dsl-enclave"], 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=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 if args.implementation=="fv-adaptive":
78 if ("fd4-rk" in args.implementation) and not ("enclave" in args.implementation):
80 if args.implementation=="fd4-rk1-dsl" or args.implementation=="fd4-rk4-dsl" or args.implementation=="fd4-rk2-dsl":
82 if args.implementation=="fd4-rk1-dsl-enclave" or args.implementation=="fd4-rk4-dsl-enclave" or args.implementation=="fd4-rk2-dsl-enclave":
84 if args.implementation=="fd4-rk1-adaptive-enclave":
86
87
88 class CCZ4Solver( SuperClass ):
89 def __init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig):
90 unknowns = {
91 "G":6, #0-5
92 "K":6, #6-11
93 "theta":1, #12
94 "Z":3, #13-15
95 "lapse":1, #16
96 "shift":3, #17-19
97 "b":3, #20-22
98 "dLapse":3, #23-25
99 "dxShift":3,#26-28
100 "dyShift":3,#29-31
101 "dzShift":3,#32-34
102 "dxG":6, #35-40
103 "dyG":6, #41-46
104 "dzG":6, #47-52
105 "traceK":1, #53
106 "phi":1, #54
107 "P":3, #55-57
108 "K0":1, #58
109 }
110
111 number_of_unknowns = sum(unknowns.values())
112
114#include "../CCZ4Kernels.h"
115"""
117 SuperClass.__init__(
118 self,
119 name=name, patch_size=patch_size,
120 unknowns=number_of_unknowns,
121 auxiliary_variables=0,
122 min_volume_h=min_mesh_unit_h, max_volume_h=max_mesh_unit_h,
123 time_step_relaxation=cfl
124 )
126 if args.implementation=="fd4-rk1-dsl":
127 rk_order = 1
128 elif args.implementation=="fd4-rk2-dsl":
129 rk_order = 2
130 else:
131 rk_order = 4
132 SuperClass.__init__(
133 self,
134 name=name, patch_size=patch_size, rk_order=rk_order,
135 unknowns=number_of_unknowns,
136 auxiliary_variables=0,
137 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
138 time_step_relaxation=cfl,
139 KOSigma=KOSig,
140 reconstruction_with_rk=args.SO_flag
141 )
143 if args.implementation=="fd4-rk1-dsl-enclave":
144 rk_order = 1
145 elif args.implementation=="fd4-rk2-dsl-enclave":
146 rk_order = 2
147 else:
148 rk_order = 4
149 SuperClass.__init__(
150 self,
151 name=name, patch_size=patch_size, rk_order=rk_order,
152 unknowns=number_of_unknowns,
153 auxiliary_variables=0,
154 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
155 time_step_relaxation=cfl,
156 KOSigma=KOSig,
157 reconstruction_with_rk=args.SO_flag
158 )
160 rk_order = int(args.implementation[6])
161 SuperClass.__init__(
162 self,
163 name=name, patch_size=patch_size, rk_order=rk_order,
164 unknowns=number_of_unknowns,
165 auxiliary_variables=0,
166 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
167 time_step_relaxation=cfl,
168 KOSigma=KOSig,
169 reconstruction_with_rk=args.SO_flag#,
170 #plot_grid_properties=True
171 )
173 rk_order = int(args.implementation[6])
174 SuperClass.__init__(
175 self,
176 name=name, patch_size=patch_size, rk_order=rk_order,
177 unknowns=number_of_unknowns,
178 auxiliary_variables=0,
179 min_meshcell_h=min_mesh_unit_h, max_meshcell_h=max_mesh_unit_h,
180 time_step_relaxation=cfl,
181 KOSigma=KOSig,
182 pde_terms_without_state=True
183 )
184 else: # only rkdg left. i.e., SuperClass == exahype2.solvers.rkdg.rusanov.GlobalAdaptiveTimeStep:
185 SuperClass.__init__(
186 self,
187 name=name,
188 rk_order = 2,
190 face_projections = exahype2.solvers.rkdg.FaceProjections.Solution,
191 unknowns=number_of_unknowns,
192 auxiliary_variables=0,
193 min_cell_h=min_mesh_unit_h, max_cell_h=max_mesh_unit_h,
194 time_step_relaxation=cfl
195 )
196
197 self._patch_size = patch_size
198 self._domain_r = domain_r
199
200 self.set_implementation(
201 boundary_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
202 ncp=exahype2.solvers.PDETerms.User_Defined_Implementation,
203 flux=exahype2.solvers.PDETerms.None_Implementation,
204 source_term=exahype2.solvers.PDETerms.User_Defined_Implementation,
205 refinement_criterion = exahype2.solvers.PDETerms.User_Defined_Implementation,
206 eigenvalues = exahype2.solvers.PDETerms.User_Defined_Implementation,
207 reconstruction_with_rk = args.SO_flag
208 )
209
211 self._fused_compute_kernel_call_cpu = exahype2.solvers.rkfd.fd4.kernels.create_compute_kernel_for_FD4(
215 compute_max_eigenvalue_of_next_time_step = True,
216 solver_variant = exahype2.solvers.rkfd.kernels.SolverVariant.Multicore,
217 kernel_variant = exahype2.solvers.rkfd.kernels.KernelVariant.BatchedAoSHeap,
218 KOSigma = self._KO_Sigma
219 )
220
222 self.postprocess_updated_patch += """{
223 #if Dimensions==2
224 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
225 #endif
226
227 #if Dimensions==3
228 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
229 #endif
230
231 int index = 0;
232 for (int i=0;i<itmax;i++)
233 {
234 applications::exahype2::ccz4::enforceCCZ4constraints( newQ+index );
235 index += {{NUMBER_OF_UNKNOWNS}} + {{NUMBER_OF_AUXILIARY_VARIABLES}};
236 }
237 }
238"""
239 else:
240 self.postprocess_updated_patch += CCZ4Helper.get_body_of_enforceCCZ4constraint()
241
243 SuperClass.create_action_sets(self)
244 self._action_set_couple_resolution_transitions_and_handle_dynamic_mesh_refinement.additional_includes += """
245#include "../CCZ4Kernels.h"
246 """
247
249 """!
250 We take this routine to add a few additional include statements.
251 """
252 return SuperClass.get_user_action_set_includes(self) + self._my_user_includes
253
255 """!
256 Add adm constriants (Hamilton and Momentum)
257 """
259
260 self._my_user_includes += """
261 #include "../CCZ4Kernels.h"
262 """
263
265 self._patch.dim[0], self._auxiliary_variables, args.SO_flag)
266
267 self.create_data_structures()
268 self.create_action_sets()
269
270 def add_Psi4W(self):
271 """
272 add psi4 writer
273 """
274 self._auxiliary_variables = 2
275
276 self._my_user_includes += """
277 #include "../libtwopunctures/TP_PunctureTracker.h"
278 #include "../CCZ4Kernels.h"
279 """
280
282 self._patch.dim[0], self._auxiliary_variables, args.SO_flag)
283
284 self.create_data_structures()
285 self.create_action_sets()
286
287
290 userinfo = []
291 exe="peano4"
292
293 if args.exe_name!="":
294 exe += "_"
295 exe += args.exe_name
296 if not args.tra_name=="de":
297 exe += "_" + args.tra_name
298 project = exahype2.Project( ["applications", "exahype2", "ccz4"], "ccz4", executable=exe)
299
300
303 is_aderdg = False
304 is_rkdg = False
305 solver_name = "CCZ4"
306
307 min_h = args.min_h
308 if min_h <=0.0:
309 print( "No minimal mesh size chosen. Set it to max mesh size (regular grid)" )
310 min_h = args.max_h
311
312 my_solver = CCZ4Solver(solver_name, args.patch_size, min_h, args.max_h, args.cfl, args.CCZ4domain_r,args.CCZ4KOSigma)
313 userinfo.append(("CFL ratio set as "+str(args.cfl), None))
314 userinfo.append(("The solver is "+args.implementation, None))
315
316
319
320 #Below are the I&R set functions for FD4
321 #These functions here do two things:
322 #1. it set the solver.interpolation parameters similar to what we do for fv, so the code know what template shoule be named.
323 #2. it computes and write the corresponding matrices for named schemes into the solver head files.
324 #notice point 2 is not needed as for build-in function (for fv) the matrices are already hard-coded.
325 interp_strategies=["TP_constant","TP_linear_with_linear_extrap_normal_interp"]
326 restrict_strategies=["TP_inject_normal_extrap","TP_average_normal_extrap"]
327 if ("fd4-rk" in args.implementation):
328 if args.interpolation == "matrix":
329 exahype2.solvers.rkfd.fd4.switch_to_FD4_matrix_interpolation( my_solver )
330 elif args.interpolation == "second_order":
331 exahype2.solvers.rkfd.fd4.switch_to_FD4_second_order_interpolation( my_solver )
332 else:
333 exahype2.solvers.rkfd.fd4.switch_to_FD4_tensor_product_interpolation( my_solver, interp_strategies[1] )
334 userinfo.append(("FD4 Interpolation: " + interp_strategies[1], None))
335
336 if args.restriction == "matrix":
337 exahype2.solvers.rkfd.fd4.switch_to_FD4_matrix_restriction( my_solver )
338 elif args.interpolation == "second_order":
339 exahype2.solvers.rkfd.fd4.switch_to_FD4_second_order_restriction( my_solver )
340 else:
341 exahype2.solvers.rkfd.fd4.switch_to_FD4_tensor_product_restriction( my_solver, restrict_strategies[1] )
342 userinfo.append(("FD4 Restriction: " + restrict_strategies[1], None))
343
344
347 if args.extension=="adm":
348 my_solver.add_adm_constriants()
349 if args.extension=="Psi4":
350 my_solver.add_Psi4W()
351
352
355 for k, v in intparams.items():
356 intparams.update({k:eval("args.CCZ4{}".format(k))})
357 for k, v in floatparams.items():
358 floatparams.update({k:eval("args.CCZ4{}".format(k))})
359
360 if args.SO_flag==True:
361 intparams.update({"SO":1})
362
363 if args.scenario=="two-punctures":
364 msg = "Periodic BC deactivated because you pick Puncture scenario\nInitialize binary black holes"
365 print(msg)
366 periodic_boundary_conditions = [False,False,False]
367 intparams.update({"swi":2}) #notice it may change, see according function in CCZ4.cpp
368 print(intparams)
369 userinfo.append((msg,None))
370 elif args.scenario=="single-puncture":
371 msg = "Periodic BC deactivated because you pick Puncture scenario\nInitialize single black hole"
372 print(msg)
373 periodic_boundary_conditions = [False,False,False]
374 intparams.update({"swi":0})
375 userinfo.append((msg,None))
376 elif args.periodic_bc==True:
377 msg = "Periodic BC set"
378 print(msg)
379 periodic_boundary_conditions = [True,True,True] # Periodic BC
380 userinfo.append((msg,None))
381 else:
382 msg = "WARNING: Periodic BC deactivated by hand"
383 print(msg)
384 periodic_boundary_conditions = [False,False,False]
385 userinfo.append((msg,None))
386
387 if args.sommerfeld_bc==True:
388 msg = "set Sommerfeld boundary condition"
389 userinfo.append((msg,None))
390 periodic_boundary_conditions = [False,False,False]
391 my_solver._action_set_handle_boundary.TemplateHandleBoundary_KernelCalls = CCZ4Helper.get_body_of_SommerfeldCondition(
392 args.scenario,
393 my_solver._unknowns,
394 my_solver._auxiliary_variables,
395 args.restart_timestamp)
396
397 solverconstants=""
398
399 if args.scenario=="gauge":
400 solverconstants+= "static constexpr int Scenario=0; /* Gauge wave */ \n "
401 userinfo.append(("picking gauge wave scenario",None))
402 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
403 intparams.update({"LapseType":0})
404 elif args.scenario=="dia_gauge":
405 solverconstants+= "static constexpr int Scenario=3; /* Diagonal Gauge wave */ \n "
406 userinfo.append(("picking diagonal gauge wave scenario",None))
407 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
408 intparams.update({"LapseType":0})
409 elif args.scenario=="linear":
410 solverconstants+= "static constexpr int Scenario=1; /* Linear wave */ \n "
411 userinfo.append(("picking linear wave scenario",None))
412 floatparams.update({"sk":0.0}); floatparams.update({"bs":0.0})
413 intparams.update({"LapseType":0})
414 elif args.scenario=="flat":
415 solverconstants+= "static constexpr int Scenario=4; /* flat spacetime */ \n "
416 userinfo.append(("picking flat scenario",None))
417 elif (args.scenario=="two-punctures") or (args.scenario=="single-puncture"):
418 solverconstants+= "static constexpr int Scenario=2; /* Two-puncture */ \n"
419 userinfo.append(("picking black hole scenario",None))
420 else:
421 raise Exception( "Scenario " + args.scenario + " is now unknown")
422
423 for k, v in floatparams.items(): solverconstants+= "static constexpr double {} = {};\n".format("CCZ4{}".format(k), v)
424 for k, v in intparams.items(): solverconstants+= "static constexpr int {} = {};\n".format("CCZ4{}".format(k), v)
425 my_solver.add_solver_constants(solverconstants)
426
427 project.add_solver(my_solver)
428
429 build_mode = modes[args.mode]
430
431 dimensions = 3
432
433
436 floatparams.update({"domain_r":args.CCZ4domain_r})
437 dr=floatparams["domain_r"]
438 offset=[-dr, -dr, -dr]; domain_size=[2*dr, 2*dr, 2*dr]
439 msg = "domain set as "+str(offset)+" and "+str(domain_size)
440 print(msg)
441 userinfo.append((msg,None))
442
443 project.set_global_simulation_parameters(
444 dimensions, # dimensions
445 offset, domain_size,
446 args.end_time, # end time
447 args.plot_start_time, args.plot_step_size, # snapshots
448 periodic_boundary_conditions,
449 8, # plotter precision
450 first_checkpoint_time_stamp=args.restart_timestamp + 0.0,
451 time_in_between_checkpoints=args.checkpoint_step_size
452 )
453
454 if not args.restart_timestamp==0.0:
455 if not args.checkpoint_path=="./":
456 cpath=args.checkpoint_path
457 elif not args.path=="./":
458 cpath=args.path
459 else:
460 cpath="./"
461 project.set_restart_from_checkpoint(expected_restart_timestamp=args.restart_timestamp, checkpoint_path=cpath)
462
463 userinfo.append(("plot start time: "+str(args.plot_start_time)+", plot step size: "+str(args.plot_step_size),None))
464 userinfo.append(("Terminal time: "+str(args.end_time),None))
465
466 project.set_Peano4_installation("../../..", build_mode)
467
468
471 path="./"
472 if not args.path=="./":
473 path=args.path
474 #path="/cosma5/data/durham/dc-zhan3/bbh-c5-1"
475 #path="/cosma6/data/dp004/dc-zhan3/exahype2/sbh-fv3"
476 project.set_output_path(path)
477 if not os.path.exists(path):
478 os.makedirs(path)
479
480 probe_point = [-100, -100, 0.0]
481 project.add_plot_filter( probe_point,[200.0, 200.0, 0.01], 1 )
482 #if args.extension=="Psi4":
483 # my_solver.select_dofs_to_print = [0,12,16,17,18,53,54,59,60]
484 #elif args.extension=="adm" or args.extension=="phy-debug":
485 # pass
486 #else:
487 # pass#my_solver.select_dofs_to_print = [0,12,16,17,18,53,54]
488
489 project.set_load_balancing("toolbox::loadbalancing::strategies::SpreadOutHierarchically","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
490 #project.set_load_balancing("toolbox::loadbalancing::strategies::SpreadOutOnceGridStagnates","(new ::exahype2::LoadBalancingConfiguration(0.95))" )
491
492
495 if args.add_tracer==1:
496 tracer_particles = project.add_tracer( name="Tracer",attribute_count=59 )
498 # particle_set=tracer_particles, coordinates=[[0,0,8.0],[0,0,-8.0],[8.0,8.0,0],[-8.0,-8.0,0]])
499 particle_set=tracer_particles, coordinates=[[-0.1,0,0],[0.1,0,0],[0,0.1,0],[0,-0.1,0]])
500 #init_action_set = exahype2.tracer.InsertParticlesFromFile(
501 # particle_set=tracer_particles, filename="t-design.dat", scale_factor=abs(offset[0])*0.8)
502 #"Gauss_Legendre_quadrature.dat" #"t-design.dat"
503 init_action_set.descend_invocation_order = 0
504 project.add_action_set_to_initialisation( init_action_set )
505
506 tracer_action_set=exahype2.tracer.FiniteVolumesTracing(tracer_particles,
507 my_solver,
508 project_on_tracer_properties_kernel="::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear",
509 )
510 tracer_action_set.descend_invocation_order = my_solver._action_set_update_cell.descend_invocation_order+1
511 project.add_action_set_to_timestepping(tracer_action_set)
512 project.add_action_set_to_initialisation(tracer_action_set)
513
515 particle_set=tracer_particles,
516 solver=my_solver,
517 filename=args.path+"Tracer-test",
518 number_of_entries_between_two_db_flushes=1000,
519 output_precision=8,
520 data_delta_between_two_snapsots=1e16,
521 position_delta_between_two_snapsots=1e16,
522 time_delta_between_two_snapsots=0.02,
523 clear_database_after_flush = True
524 )
525 dump_action_set.descend_invocation_order = my_solver._action_set_update_cell.descend_invocation_order+2
526 project.add_action_set_to_timestepping(dump_action_set)
527
528 if args.add_tracer==2:
529 if args.CCZ4BBHType == 2:
530 puncture_position = [[2.0,0,0],[-2.0,0,0]]
531 elif args.CCZ4BBHType == 3:
532 puncture_position = [[3.5,0,0],[-3.5,0,0]]
533 tracer_particles = project.add_tracer( name="Tracer",attribute_count=59 )
535 particle_set=tracer_particles, coordinates=puncture_position)
536 init_action_set.descend_invocation_order = 0
537 project.add_action_set_to_initialisation( init_action_set )
538
539 tracer_action_set=exahype2.tracer.FiniteVolumesTracing(tracer_particles,
540 my_solver,
541 project_on_tracer_properties_kernel="::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear_explicit_Euler",
542 projection_kernel_arguments="""marker,
543 {{PATCH_SIZE}},
544 {{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}},
545 fineGridCell{{SOLVER_NAME}}Q.value,
546 fineGridCell{{SOLVER_NAME}}CellLabel.getTimeStepSize(),
547 {17,18,19},
548 {-1,-1,-1},
549 *p
550 """
551 )
552 tracer_action_set.descend_invocation_order = my_solver._action_set_compute_final_linear_combination.descend_invocation_order+1
553 project.add_action_set_to_timestepping(tracer_action_set)
554 project.add_action_set_to_initialisation(tracer_action_set)
555
557 particle_set=tracer_particles,
558 solver=my_solver,
559 filename=args.path+"Tracer-BHTracker",
560 number_of_entries_between_two_db_flushes=1000,
561 output_precision=8,
562 data_delta_between_two_snapsots=1e16,
563 position_delta_between_two_snapsots=1e16,
564 time_delta_between_two_snapsots=0.02,
565 clear_database_after_flush = True
566 )
567 dump_action_set.descend_invocation_order = my_solver._action_set_compute_final_linear_combination.descend_invocation_order+2
568 project.add_action_set_to_timestepping(dump_action_set)
569
570
573 peano4_project = project.generate_Peano4_project(verbose=True)
574
575 if args.scenario=="gauge" or args.scenario=="linear" or args.scenario=="dia_gauge" or args.scenario=="flat":
576 pass
577 elif args.scenario=="two-punctures" or args.scenario=="single-puncture":
578 #
579 # There are two different things to do when we pick a scneario: We have
580 # to configure the solver accordingly (and keep in mind that every solver
581 # needs its own config), and then we might have to adopt the build
582 # environment.
583 #
584 peano4_project.output.makefile.add_linker_flag( "-lm -lgsl -lgslcblas" )
585 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Utilities.cpp" )
586 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Parameters.cpp" )
587 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TP_Logging.cpp" )
588 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/TwoPunctures.cpp" )
589 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/CoordTransf.cpp" )
590 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/Equations.cpp" )
591 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/FuncAndJacobian.cpp" )
592 peano4_project.output.makefile.add_cpp_file( "libtwopunctures/Newton.cpp" )
593 peano4_project.output.makefile.add_CXX_flag( "-DIncludeTwoPunctures" )
594 else:
595 raise Exception( "Scenario " + args.scenario + " is now unknown")
596
597 peano4_project.output.makefile.add_CXX_flag( "-DCCZ4EINSTEIN" )
598 peano4_project.output.makefile.add_cpp_file( "InitialValues.cpp" )
599 peano4_project.output.makefile.add_cpp_file( "CCZ4Kernels.cpp" )
600
601 peano4_project.generate( throw_away_data_after_generation=False )
602 peano4_project.build( make_clean_first = True )
603
604 #Report the application information
605 userinfo.append(("the executable file name: "+exe, None))
606 userinfo.append(("output directory: "+path, None))
607 print("=========================================================")
608 if not args.add_tracer==0:
609 userinfo.append(("tracer output file: "+args.path+"Tracer-test", None))
610 if not args.restart_timestamp==0.0:
611 userinfo.append(("the code will restart from the first checkpoint after timestamp "+str(args.restart_timestamp), None))
612 if len(userinfo) >0:
613 print("The building information:")
614 for msg, exception in userinfo:
615 if exception is None:
616 print(msg)
617 else: print(msg, "Exception: {}".format(exception))
618 print(intparams)
619 print(floatparams)
620 print("=========================================================")
get_user_action_set_includes(self)
We take this routine to add a few additional include statements.
Definition ccz4.py:248
_source_term_implementation
Definition ccz4.py:214
add_adm_constriants(self)
Add adm constriants (Hamilton and Momentum)
Definition ccz4.py:254
create_action_sets(self)
Definition ccz4.py:242
__init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig)
Definition ccz4.py:89
_preprocess_reconstructed_patch
Definition ccz4.py:264
add_Psi4W(self)
add psi4 writer
Definition ccz4.py:270
_fused_compute_kernel_call_cpu
Definition ccz4.py:211
ExaHyPE 2 project.
Definition Project.py:14
The Gauss-Legendre Basis is by construction the only basis which yields diagonal mass matrices.
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:80
int
Definition ccz4.py:42