13from Probe_file_gene
import tracer_seeds_generate
14from ComputeFirstDerivatives
import ComputeFirstDerivativesFD4RK
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,
28 "GLMc0":1.5,
"GLMc":1.2,
"GLMd":2.0,
"GLMepsA":1.0,
"GLMepsP":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,
33 "domain_r":0.5,
"smoothing":0.0,
"KOSigma":8.0
36intparams = {
"BBHType":2,
"LapseType":1,
"tp_grid_setup":0,
"swi":99,
"ReSwi":0,
"SO":0}
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)" )
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():
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")
72 args = parser.parse_args()
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":
89 def __init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig):
111 number_of_unknowns = sum(unknowns.values())
114#include "../CCZ4Kernels.h"
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
126 if args.implementation==
"fd4-rk1-dsl":
128 elif args.implementation==
"fd4-rk2-dsl":
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,
140 reconstruction_with_rk=args.SO_flag
143 if args.implementation==
"fd4-rk1-dsl-enclave":
145 elif args.implementation==
"fd4-rk2-dsl-enclave":
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,
157 reconstruction_with_rk=args.SO_flag
160 rk_order =
int(args.implementation[6])
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,
169 reconstruction_with_rk=args.SO_flag
173 rk_order =
int(args.implementation[6])
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,
182 pde_terms_without_state=
True
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
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
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
222 self.postprocess_updated_patch +=
"""{
224 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
228 constexpr int itmax = {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}} * {{NUMBER_OF_VOLUMES_PER_AXIS}};
232 for (int i=0;i<itmax;i++)
234 applications::exahype2::ccz4::enforceCCZ4constraints( newQ+index );
235 index += {{NUMBER_OF_UNKNOWNS}} + {{NUMBER_OF_AUXILIARY_VARIABLES}};
243 SuperClass.create_action_sets(self)
244 self._action_set_couple_resolution_transitions_and_handle_dynamic_mesh_refinement.additional_includes +=
"""
245#include "../CCZ4Kernels.h"
250 We take this routine to add a few additional include statements.
256 Add adm constriants (Hamilton and Momentum)
261 #include "../CCZ4Kernels.h"
267 self.create_data_structures()
277 #include "../libtwopunctures/TP_PunctureTracker.h"
278 #include "../CCZ4Kernels.h"
284 self.create_data_structures()
293 if args.exe_name!=
"":
296 if not args.tra_name==
"de":
297 exe +=
"_" + args.tra_name
309 print(
"No minimal mesh size chosen. Set it to max mesh size (regular grid)" )
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))
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 )
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))
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 )
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))
347 if args.extension==
"adm":
348 my_solver.add_adm_constriants()
349 if args.extension==
"Psi4":
350 my_solver.add_Psi4W()
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))})
360 if args.SO_flag==
True:
361 intparams.update({
"SO":1})
363 if args.scenario==
"two-punctures":
364 msg =
"Periodic BC deactivated because you pick Puncture scenario\nInitialize binary black holes"
366 periodic_boundary_conditions = [
False,
False,
False]
367 intparams.update({
"swi":2})
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"
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"
379 periodic_boundary_conditions = [
True,
True,
True]
380 userinfo.append((msg,
None))
382 msg =
"WARNING: Periodic BC deactivated by hand"
384 periodic_boundary_conditions = [
False,
False,
False]
385 userinfo.append((msg,
None))
387 if args.sommerfeld_bc==
True:
388 msg =
"set Sommerfeld boundary condition"
389 userinfo.append((msg,
None))
390 periodic_boundary_conditions = [
False,
False,
False]
394 my_solver._auxiliary_variables,
395 args.restart_timestamp)
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))
421 raise Exception(
"Scenario " + args.scenario +
" is now unknown")
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)
427 project.add_solver(my_solver)
429 build_mode = modes[args.mode]
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)
441 userinfo.append((msg,
None))
443 project.set_global_simulation_parameters(
447 args.plot_start_time, args.plot_step_size,
448 periodic_boundary_conditions,
450 first_checkpoint_time_stamp=args.restart_timestamp + 0.0,
451 time_in_between_checkpoints=args.checkpoint_step_size
454 if not args.restart_timestamp==0.0:
455 if not args.checkpoint_path==
"./":
456 cpath=args.checkpoint_path
457 elif not args.path==
"./":
461 project.set_restart_from_checkpoint(expected_restart_timestamp=args.restart_timestamp, checkpoint_path=cpath)
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))
466 project.set_Peano4_installation(
"../../..", build_mode)
472 if not args.path==
"./":
476 project.set_output_path(path)
477 if not os.path.exists(path):
480 probe_point = [-100, -100, 0.0]
481 project.add_plot_filter( probe_point,[200.0, 200.0, 0.01], 1 )
489 project.set_load_balancing(
"toolbox::loadbalancing::strategies::SpreadOutHierarchically",
"(new ::exahype2::LoadBalancingConfiguration(0.95))" )
495 if args.add_tracer==1:
496 tracer_particles = project.add_tracer( name=
"Tracer",attribute_count=59 )
499 particle_set=tracer_particles, coordinates=[[-0.1,0,0],[0.1,0,0],[0,0.1,0],[0,-0.1,0]])
503 init_action_set.descend_invocation_order = 0
504 project.add_action_set_to_initialisation( init_action_set )
508 project_on_tracer_properties_kernel=
"::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear",
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)
515 particle_set=tracer_particles,
517 filename=args.path+
"Tracer-test",
518 number_of_entries_between_two_db_flushes=1000,
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
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)
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 )
541 project_on_tracer_properties_kernel=
"::exahype2::fv::projectAllValuesOntoParticle_piecewiseLinear_explicit_Euler",
542 projection_kernel_arguments=
"""marker,
544 {{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}},
545 fineGridCell{{SOLVER_NAME}}Q.value,
546 fineGridCell{{SOLVER_NAME}}CellLabel.getTimeStepSize(),
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)
557 particle_set=tracer_particles,
559 filename=args.path+
"Tracer-BHTracker",
560 number_of_entries_between_two_db_flushes=1000,
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
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)
573 peano4_project = project.generate_Peano4_project(verbose=
True)
575 if args.scenario==
"gauge" or args.scenario==
"linear" or args.scenario==
"dia_gauge" or args.scenario==
"flat":
577 elif args.scenario==
"two-punctures" or args.scenario==
"single-puncture":
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" )
595 raise Exception(
"Scenario " + args.scenario +
" is now unknown")
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" )
601 peano4_project.generate( throw_away_data_after_generation=
False )
602 peano4_project.build( make_clean_first =
True )
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))
613 print(
"The building information:")
614 for msg, exception
in userinfo:
615 if exception
is None:
617 else: print(msg,
"Exception: {}".format(exception))
620 print(
"=========================================================")
get_user_action_set_includes(self)
We take this routine to add a few additional include statements.
_source_term_implementation
add_adm_constriants(self)
Add adm constriants (Hamilton and Momentum)
__init__(self, name, patch_size, min_mesh_unit_h, max_mesh_unit_h, cfl, domain_r, KOSig)
_preprocess_reconstructed_patch
add_Psi4W(self)
add psi4 writer
_fused_compute_kernel_call_cpu
The Gauss-Legendre Basis is by construction the only basis which yields diagonal mass matrices.
Dump the tracer data into a csv database.
Particle tracing over the Finite Volumes solver.
Basically superclass, though we add these numbers.
get_body_of_adm_constraints(patch_size, number_of_output_variable, so_flag)
get_body_of_SommerfeldCondition(scenario, unknowns, auxiliary_variables, restart_time=-1)
get_body_of_enforceCCZ4constraint()
get_body_of_Psi_Calc(patch_size, number_of_output_variable, so_flag)