23from CCZ4Solver
import CCZ4Solver_FV_GlobalAdaptiveTimeStepWithEnclaveTasking
24from CCZ4Solver
import CCZ4Solver_FD4_GlobalAdaptiveTimeStepWithEnclaveTasking
25from CCZ4Solver
import (
26 CCZ4Solver_FD4_SecondOrderFormulation_GlobalAdaptiveTimeStepWithEnclaveTasking,
29from CCZ4Solver
import CCZ4Solver_FV_GlobalAdaptiveTimeStep
30from CCZ4Solver
import CCZ4Solver_FD4_GlobalAdaptiveTimeStep
40 NONE =
"::peano4::utils::LoopPlacement::Serial"
41 PARALLEL_FOR =
"::peano4::utils::LoopPlacement::Nested"
42 SUBTASKS =
"::peano4::utils::LoopPlacement::SpreadOut"
48 Construct the Finite Volume (limiter) scheme
50 We assume that the underlying Finite Differences scheme has a patch
51 size of 6x6x6. To make the Finite Volume scheme's time stepping (and
52 accuracy) match this patch size, we have to employ a 16 times finer
55 It is interesting to see that the limiter does not really have a min
56 and max mesh size. The point is that the higher order solver dictates
57 the mesh structure, and we then follow this structure with the
66 amend_priorities: bool,
67 parallelisation_of_kernels: KernelParallelisation,
74 Pass in the patch size of the FD4 scheme or, if you are using RKDG,
75 hand in the number 1. The Finite Volume patch then will be 16 times
79 SubPatchSize = int(patch_size * 4 * 4)
83 patch_size=SubPatchSize,
84 min_volume_h=1.0 / 65536,
85 max_volume_h=1.0 / 65536,
86 pde_terms_without_state=
True,
91#include "toolbox/blockstructured/Restriction.h"
92#include "toolbox/blockstructured/Interpolation.h"
106 initial_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
107 refinement_criterion=exahype2.solvers.PDETerms.Empty_Implementation,
108 boundary_conditions=exahype2.solvers.PDETerms.Empty_Implementation,
111 if parallelisation_of_kernels == KernelParallelisation.SUBTASKS:
123 compute_max_eigenvalue_of_next_time_step=
True,
124 solver_variant=exahype2.solvers.fv.rusanov.kernels.SolverVariant.Multicore,
125 kernel_variant=exahype2.solvers.fv.rusanov.kernels.KernelVariant.PatchWiseAoSHeap,
134 Mask out exterior cells
140 +
" and repositories::instanceOf"
142 +
".isCellOverlappingWithBHImpactArea(marker) )"
149 +
" and repositories::instanceOf"
151 +
".isCellOverlappingWithBHImpactArea(marker) )"
158 +
" and repositories::instanceOf"
160 +
".isCellOverlappingWithBHImpactArea(marker) )"
164 return "{} and repositories::instanceOf{}.isOneAdjacentCellOverlappingWithBHImpactArea(marker)".format(
170 return "({} and repositories::instanceOf{}.areBothAdjacentCellsOverlappingWithBHImpactArea(marker))".format(
175 return "({} and repositories::instanceOf{}.areBothAdjacentCellsOverlappingWithBHImpactArea(marker))".format(
182 Not really a lot of things to do here. The only exception that is
183 really important is that we have to ensure that we only solve stuff
184 inside the local domain of the FV. By default, ExaHyPE 2 solves the
185 PDE everywhere. If data is not stored persistently or loaded from
186 the persistent stacks, it still solves, as it then would assume that
187 such data arises from dynamic AMR. In this particular case, we have
188 to really mask out certain subdomains.
190 It is not just a nice optimisation to do so. It is absolutely key,
191 as the application of the compute kernel on garbage would mean that
192 we end up with invalid eigenvalues.
208 4th order Finite Differences solver with a limiter
210 The FD scheme is our primary solver, i.e. the one we wanna use (almost)
211 everywhere. Hence, we have to be sure that we use the right boundary
212 conditions. In our case, that should be Sommerfeld ones. As we work
213 with a limited FD4 solver, we have to ensure that we get the
214 @ref benchmarks_exahype2_ccz4_single_black_hole "solver coupling" right.
216 The primary solver is a plain CCZ4 FD4 solver with enclave tasking. There
217 are some modification though:
219 1. We ensure that we use Sommerfeld boundary conditions. This means that
220 we have to replace the whole generic boundary treatment with a bespoke
222 2. The coupling has to be injected. We model the coupling as separate
223 (enclave) tasks to avoid that we totally serialise the solver steps
224 whenever we encounter a coupling.
234 parallelisation_of_interpolation: KernelParallelisation,
235 parallelisation_of_kernels: KernelParallelisation,
236 interpolation_method,
242 CCZ4Solver_FD4_GlobalAdaptiveTimeStepWithEnclaveTasking.__init__(
245 patch_size=patch_size,
247 min_meshcell_h=min_cell_size / patch_size,
248 max_meshcell_h=max_cell_size / patch_size,
249 pde_terms_without_state=
False,
253#include "toolbox/blockstructured/Projection.h"
254#include "toolbox/blockstructured/Restriction.h"
255#include "toolbox/blockstructured/Interpolation.h"
256#include "toolbox/blockstructured/Copy.h"
261#include "matrixdata/Interpolator_"""
264 + str(patch_size * 16)
271 initial_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
272 refinement_criterion=exahype2.solvers.PDETerms.Empty_Implementation,
273 boundary_conditions=exahype2.solvers.PDETerms.None_Implementation,
279 if parallelisation_of_kernels == KernelParallelisation.SUBTASKS:
281 "WARNING: Unfortunately, we have not yet written parallelised kernels for FD4"
288 patch_size, patch_size * 16, 3, 1
290 solver_matrix_interpolator.generateData()
295 Tailor action set behaviour
297 We first make a few additional cells skeleton cells. The rationale
298 behind additional skeletons is given in the @ref benchmarks_exahype2_ccz4_single_black_hole "generic overview".
299 Given the first remark there on FD4-FV coupling, one would be tempted
302 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
303 self._action_set_update_cell.additional_skeleton_guard = " " "(
304 repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.isCellOverlappingWithBHImpactArea(marker)
306 not repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.areAllFaceConnectedCellsOverlappingWithBHImpactArea(marker)
309 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
311 Once we study the other items (notably the fourth), we see that it is
312 reasonable to make all the overlap region a skeleton within the FD4
320 double Qinf[59]={1.0, 0.0, 0.0, 1.0, 0.0, 1.0, //q0-5
321 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q6-11
322 0.0, 0.0, 0.0, 0.0, //q12-15
323 1.0, 0.0, 0.0, 0.0, //q16-19
324 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q20-25
325 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q26-34
326 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
327 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q35-52
328 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 //q53-58
329 }; //approximate background solution at infinity
330 ::exahype2::fd::applySommerfeldConditions(
332 const double * __restrict__ Q,
333 const tarch::la::Vector<Dimensions,double>& faceCentre,
334 const tarch::la::Vector<Dimensions,double>& gridCellH,
340 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue( Q, faceCentre, gridCellH, t, dt, normal, &temp );
344 double * __restrict__ Q,
345 const tarch::la::Vector<Dimensions,double>& faceCentre,
346 const tarch::la::Vector<Dimensions,double>& gridCellH
353 Q[0] = 1.0; Q[3] = 1.0; Q[5] = 1.0;
354 Q[16] = 0.95; Q[54] = 0.95;
358 {{FACE_METADATA_ACCESSOR}}.getOldTimeStamp(marker.getSelectedFaceNumber()<Dimensions ? 1 : 0),
359 repositories::{{SOLVER_INSTANCE}}.getMinTimeStepSize(),
360 {{NUMBER_OF_GRID_CELLS_PER_PATCH_PER_AXIS}},
362 {{NUMBER_OF_UNKNOWNS}},
363 {{NUMBER_OF_AUXILIARY_VARIABLES}},
364 marker.getSelectedFaceNumber(),
366 fineGridFace{{UNKNOWN_IDENTIFIER}}Old.value,
367 fineGridFace{{UNKNOWN_IDENTIFIER}}New.value,
368 -1 //not use checkpoint yet
375 enclave_task_cell_label=
"fineGridCell"
378 compute_kernel_implementation=
"""
379const int sizeOfPatch = (repositories::instanceOf"""
381 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch+2)
382 * (repositories::instanceOf"""
384 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch+2)
385 * (repositories::instanceOf"""
387 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch+2)
388 * (repositories::instanceOf"""
390 +
"""_FV.NumberOfUnknowns + repositories::instanceOf"""
392 +
"""_FV.NumberOfAuxiliaryVariables);
393const int sizeOfFace = 2
394 * (repositories::instanceOf"""
396 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch+2)
397 * (repositories::instanceOf"""
399 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch+2)
400 * (repositories::instanceOf"""
402 +
"""_FV.NumberOfUnknowns + repositories::instanceOf"""
404 +
"""_FV.NumberOfAuxiliaryVariables);
406double* interpolatedFVDataWithHalo = ::tarch::allocateMemory<double>(sizeOfPatch, ::tarch::MemoryLocation::Heap);
408bool faceIsReal0 = repositories::instanceOf"""
410 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,0);
411bool faceIsReal1 = repositories::instanceOf"""
413 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,1);
414bool faceIsReal2 = repositories::instanceOf"""
416 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,2);
417bool faceIsReal3 = repositories::instanceOf"""
419 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,3);
420bool faceIsReal4 = repositories::instanceOf"""
422 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,4);
423bool faceIsReal5 = repositories::instanceOf"""
425 +
"""_FV.areBothAdjacentCellsOverlappingWithBHImpactArea(marker,5);
427double* realFace0 = faceIsReal0 ? fineGridFaces"""
429 +
"""_FVQNew(0).value : nullptr;
430double* realFace1 = faceIsReal1 ? fineGridFaces"""
432 +
"""_FVQNew(1).value : nullptr;
433double* realFace2 = faceIsReal2 ? fineGridFaces"""
435 +
"""_FVQNew(2).value : nullptr;
436double* realFace3 = faceIsReal3 ? fineGridFaces"""
438 +
"""_FVQNew(3).value : nullptr;
439double* realFace4 = faceIsReal4 ? fineGridFaces"""
441 +
"""_FVQNew(4).value : nullptr;
442double* realFace5 = faceIsReal5 ? fineGridFaces"""
444 +
"""_FVQNew(5).value : nullptr;
446double* dummyFace0 = faceIsReal0 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
447double* dummyFace1 = faceIsReal1 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
448double* dummyFace2 = faceIsReal2 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
449double* dummyFace3 = faceIsReal3 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
450double* dummyFace4 = faceIsReal4 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
451double* dummyFace5 = faceIsReal5 ? nullptr : ::tarch::allocateMemory<double>(sizeOfFace, ::tarch::MemoryLocation::Heap);
453::toolbox::blockstructured::interpolateCellDataAssociatedToVolumesIntoOverlappingCell_"""
456 repositories::instanceOf"""
458 +
"""_FD4.NumberOfGridCellsPerPatchPerAxis,
459 repositories::instanceOf"""
461 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch,
464 repositories::instanceOf"""
466 +
"""_FV.NumberOfUnknowns + repositories::instanceOf"""
468 +
"""_FV.NumberOfAuxiliaryVariables,
471 """InterpolationMatrixData::Data,
472 InterpolationMatrixData::Indices,
473 InterpolationMatrixData::Indptr,"""
479 interpolatedFVDataWithHalo,
485::toolbox::blockstructured::projectPatchHaloOntoFaces(
486 repositories::instanceOf"""
488 +
"""_FV.NumberOfFiniteVolumesPerAxisPerPatch,
490 repositories::instanceOf"""
492 +
"""_FV.NumberOfUnknowns,
493 repositories::instanceOf"""
495 +
"""_FV.NumberOfAuxiliaryVariables,
496 interpolatedFVDataWithHalo,
497 faceIsReal0 ? realFace0 : dummyFace0,
498 faceIsReal1 ? realFace1 : dummyFace1,
499 faceIsReal2 ? realFace2 : dummyFace2,
500 faceIsReal3 ? realFace3 : dummyFace3,
501 faceIsReal4 ? realFace4 : dummyFace4,
502 faceIsReal5 ? realFace5 : dummyFace5
505::tarch::freeMemory(interpolatedFVDataWithHalo, tarch::MemoryLocation::Heap );
506if (dummyFace0!=nullptr) ::tarch::freeMemory(dummyFace0, tarch::MemoryLocation::Heap );
507if (dummyFace1!=nullptr) ::tarch::freeMemory(dummyFace1, tarch::MemoryLocation::Heap );
508if (dummyFace2!=nullptr) ::tarch::freeMemory(dummyFace2, tarch::MemoryLocation::Heap );
509if (dummyFace3!=nullptr) ::tarch::freeMemory(dummyFace3, tarch::MemoryLocation::Heap );
510if (dummyFace4!=nullptr) ::tarch::freeMemory(dummyFace4, tarch::MemoryLocation::Heap );
511if (dummyFace5!=nullptr) ::tarch::freeMemory(dummyFace5, tarch::MemoryLocation::Heap );
520 repositories::instanceOf"""
522 +
"""_FV.isCellOverlappingWithBHImpactArea(marker)
524 not repositories::instanceOf"""
526 +
"""_FV.areAllFaceConnectedCellsOverlappingWithBHImpactArea(marker)
528 not marker.willBeRefined()
536 repositories::instanceOf{0}_FV.isCellOverlappingWithBHImpactArea(marker)
538 not marker.willBeRefined()
540 logTraceIn( "touchCellFirstTime(...)-inject" );
542 repositories::instanceOf{0}_FV.incNumberOfPatches();
544 //if ( repositories::instanceOf{0}_FV.areAllFaceConnectedCellsOverlappingWithBHImpactArea(marker) ) {{
545 ::toolbox::blockstructured::restrictCellIntoOverlappingCell_inject(
546 repositories::instanceOf{0}_FV.NumberOfFiniteVolumesPerAxisPerPatch,
547 repositories::instanceOf{0}_FD4.NumberOfGridCellsPerPatchPerAxis,
548 repositories::instanceOf{0}_FV.NumberOfUnknowns + repositories::instanceOf{0}_FV.NumberOfAuxiliaryVariables,
549 fineGridCell{0}_FVQ.value,
550 fineGridCell{0}_FD4Q.value
554 ::toolbox::blockstructured::restrictCellIntoOverlappingCell_inject_and_average(
555 repositories::instanceOf{0}_FV.NumberOfFiniteVolumesPerAxisPerPatch,
556 repositories::instanceOf{0}_FD4.NumberOfGridCellsPerPatchPerAxis,
557 repositories::instanceOf{0}_FV.NumberOfUnknowns + repositories::instanceOf{0}_FV.NumberOfAuxiliaryVariables,
558 fineGridCell{0}_FVQ.value,
559 fineGridCell{0}_FD4Q.value
563 logTraceOut( "touchCellFirstTime(...)-inject" );
574 Construct 4th order Finite Differences solver without a limiter
587 CCZ4Solver_FD4_GlobalAdaptiveTimeStepWithEnclaveTasking.__init__(
590 patch_size=patch_size,
592 min_meshcell_h=min_cell_size / patch_size,
593 max_meshcell_h=max_cell_size / patch_size,
594 pde_terms_without_state=
False,
598#include "toolbox/blockstructured/Projection.h"
599#include "toolbox/blockstructured/Restriction.h"
600#include "toolbox/blockstructured/Interpolation.h"
601#include "toolbox/blockstructured/Copy.h"
608 initial_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
609 refinement_criterion=exahype2.solvers.PDETerms.Empty_Implementation,
610 boundary_conditions=exahype2.solvers.PDETerms.None_Implementation,
619 Tailor action set behaviour
621 We first make a few additional cells skeleton cells. The rationale
622 behind additional skeletons is given in the @ref benchmarks_exahype2_ccz4_single_black_hole "generic overview".
623 Given the first remark there on FD4-FV coupling, one would be tempted
626 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
627 self._action_set_update_cell.additional_skeleton_guard = " " "(
628 repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.isCellOverlappingWithBHImpactArea(marker)
630 not repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.areAllFaceConnectedCellsOverlappingWithBHImpactArea(marker)
633 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
635 Once we study the other items (notably the fourth), we see that it is
636 reasonable to make all the overlap region a skeleton within the FD4
644 double Qinf[59]={1.0, 0.0, 0.0, 1.0, 0.0, 1.0, //q0-5
645 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q6-11
646 0.0, 0.0, 0.0, 0.0, //q12-15
647 1.0, 0.0, 0.0, 0.0, //q16-19
648 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q20-25
649 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q26-34
650 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
651 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q35-52
652 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 //q53-58
653 }; //approximate background solution at infinity
654 ::exahype2::fd::applySommerfeldConditions(
656 const double * __restrict__ Q,
657 const tarch::la::Vector<Dimensions,double>& faceCentre,
658 const tarch::la::Vector<Dimensions,double>& gridCellH,
664 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue( Q, faceCentre, gridCellH, t, dt, normal, &temp );
668 double * __restrict__ Q,
669 const tarch::la::Vector<Dimensions,double>& faceCentre,
670 const tarch::la::Vector<Dimensions,double>& gridCellH
677 Q[0] = 1.0; Q[3] = 1.0; Q[5] = 1.0;
678 Q[16] = 0.95; Q[54] = 0.95;
682 {{FACE_METADATA_ACCESSOR}}.getOldTimeStamp(marker.getSelectedFaceNumber()<Dimensions ? 1 : 0),
683 repositories::{{SOLVER_INSTANCE}}.getMinTimeStepSize(),
684 {{NUMBER_OF_GRID_CELLS_PER_PATCH_PER_AXIS}},
686 {{NUMBER_OF_UNKNOWNS}},
687 {{NUMBER_OF_AUXILIARY_VARIABLES}},
688 marker.getSelectedFaceNumber(),
690 fineGridFace{{UNKNOWN_IDENTIFIER}}Old.value,
691 fineGridFace{{UNKNOWN_IDENTIFIER}}New.value,
692 -1 // @todo Han, can you add a comment here please why we do -1?
701 A finite volume solver
703 This solver is not appropriate to simulate black holes as a stand-alone
704 solver, as it is way too diffusive. If you use it without another scheme,
705 you typically see the black hole disappear after a brief period. So we
706 have it in here merely for performance tests.
719 Construct the Finite Volume solver
721 @param patch_size: Integer
722 Defines how big the individual patches are. If you pass in 10, each
723 Finite Volume patch will have the dimensions 10x10x10.
724 @param min_cell_size: Float
725 This parameter refers to the cell size, i.e. the size of a whole
726 patch. We use this one here, to make the signature the same as for
727 the FD and DG solver variants. The superclass constructor argues
728 over finite volume sizes, and we hence have to recalibrate this
729 parameter with patch_size.
735 patch_size=patch_size,
736 min_volume_h=min_cell_size / patch_size,
737 max_volume_h=max_cell_size / patch_size,
738 pde_terms_without_state=
True,
742#include "toolbox/blockstructured/Projection.h"
743#include "toolbox/blockstructured/Restriction.h"
744#include "toolbox/blockstructured/Interpolation.h"
745#include "toolbox/blockstructured/Copy.h"
746#include "exahype2/fd/BoundaryConditions.h"
753 initial_conditions=exahype2.solvers.PDETerms.User_Defined_Implementation,
754 refinement_criterion=exahype2.solvers.PDETerms.Empty_Implementation,
755 boundary_conditions=exahype2.solvers.PDETerms.Empty_Implementation,
764 Tailor action set behaviour
766 We first make a few additional cells skeleton cells. The rationale
767 behind additional skeletons is given in the @ref benchmarks_exahype2_ccz4_single_black_hole "generic overview".
768 Given the first remark there on FD4-FV coupling, one would be tempted
771 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
772 self._action_set_update_cell.additional_skeleton_guard = " " "(
773 repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.isCellOverlappingWithBHImpactArea(marker)
775 not repositories::instanceOf" " " + self._name_without_FD4_extension + " " "_FV.areAllFaceConnectedCellsOverlappingWithBHImpactArea(marker)
778 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
780 Once we study the other items (notably the fourth), we see that it is
781 reasonable to make all the overlap region a skeleton within the FD4
789 double Qinf[59]={1.0, 0.0, 0.0, 1.0, 0.0, 1.0, //q0-5
790 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q6-11
791 0.0, 0.0, 0.0, 0.0, //q12-15
792 1.0, 0.0, 0.0, 0.0, //q16-19
793 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q20-25
794 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q26-34
795 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
796 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, //q35-52
797 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 //q53-58
798 }; //approximate background solution at infinity
799 ::exahype2::fd::applySommerfeldConditions(
801 const double * __restrict__ Q,
802 const tarch::la::Vector<Dimensions,double>& faceCentre,
803 const tarch::la::Vector<Dimensions,double>& gridCellH,
809 repositories::{{SOLVER_INSTANCE}}.maxEigenvalue( Q, faceCentre, gridCellH, t, dt, normal, &temp );
813 double * __restrict__ Q,
814 const tarch::la::Vector<Dimensions,double>& faceCentre,
815 const tarch::la::Vector<Dimensions,double>& gridCellH
822 Q[0] = 1.0; Q[3] = 1.0; Q[5] = 1.0;
823 Q[16] = 0.95; Q[54] = 0.95;
827 {{FACE_METADATA_ACCESSOR}}.getOldTimeStamp(marker.getSelectedFaceNumber()<Dimensions ? 1 : 0),
828 repositories::{{SOLVER_INSTANCE}}.getMinTimeStepSize(),
829 {{NUMBER_OF_VOLUMES_PER_AXIS}},
831 {{NUMBER_OF_UNKNOWNS}},
832 {{NUMBER_OF_AUXILIARY_VARIABLES}},
833 marker.getSelectedFaceNumber(),
835 fineGridFace{{UNKNOWN_IDENTIFIER}}Old.value,
836 fineGridFace{{UNKNOWN_IDENTIFIER}}New.value,
837 -1 // @todo Han, can you add a comment here please why we do -1?
846 Update preconfigured solver parameters
848 The default parameters of CCZ4 are tailored towards gauge waves or similar.
849 For the single black hole, two parameters have to be changed. That's bs and
850 sk which both have to be 1.0.
853 solver.double_constants[
"CCZ4bs"] = 1.0
854 solver.double_constants[
"CCZ4sk"] = 1.0
add_all_solver_constants(self)
Add domain-specific constants.
CCZ4 solver using fourth-order finite differences and global adaptive time stepping incl enclave task...
CCZ4 solver using finite volumes and global adaptive time stepping incl enclave tasking.
4th order Finite Differences solver with a limiter
_action_set_postprocess_solution
__init__(self, name, patch_size, min_cell_size, max_cell_size, KernelParallelisation parallelisation_of_interpolation, KernelParallelisation parallelisation_of_kernels, interpolation_method)
Constructor.
create_action_sets(self)
Tailor action set behaviour.
_name_without_FD4_extension
_parallelisation_of_interpolation
_action_set_preprocess_solution
Construct 4th order Finite Differences solver without a limiter.
_name_without_FD4_extension
create_action_sets(self)
Tailor action set behaviour.
__init__(self, name, patch_size, min_cell_size, max_cell_size)
Constructor.
__init__(self, name, patch_size, min_cell_size, max_cell_size)
Construct the Finite Volume solver.
create_action_sets(self)
Tailor action set behaviour.
Construct the Finite Volume (limiter) scheme.
create_action_sets(self)
Not really a lot of things to do here.
_source_term_implementation
_fused_compute_kernel_call_cpu
_provide_face_data_to_compute_kernels_default_guard(self)
_store_cell_data_default_guard(self)
Mask out exterior cells.
_provide_cell_data_to_compute_kernels_default_guard(self)
Default logic when to create cell data or not.
_store_face_data_default_guard(self)
Extend the guard via ands only.
_load_cell_data_default_guard(self)
Extend the guard via ands only.
__init__(self, name, patch_size, bool amend_priorities, KernelParallelisation parallelisation_of_kernels)
Construct the limiter.
_load_face_data_default_guard(self)
Extend the guard via ands only.
_action_set_merge_enclave_task_outcome
set_implementation(self, boundary_conditions, refinement_criterion, initial_conditions, memory_location, use_split_loop, additional_action_set_includes, additional_user_includes)
If you pass in User_Defined, then the generator will create C++ stubs that you have to befill manuall...
_action_set_handle_boundary
_user_action_set_includes
_source_term_implementation
_source_term_implementation
set_implementation(self, flux=None, ncp=None, eigenvalues=None, boundary_conditions=None, refinement_criterion=None, initial_conditions=None, source_term=None, memory_location=None, use_split_loop=False, additional_action_set_includes="", additional_user_includes="")
If you pass in User_Defined, then the generator will create C++ stubs that you have to befill manuall...
_user_action_set_includes
_action_set_postprocess_solution
_action_set_preprocess_solution
_action_set_handle_boundary
set_implementation(self, flux, ncp, source_term, eigenvalues, boundary_conditions, refinement_criterion, initial_conditions, memory_location, additional_action_set_includes, additional_user_includes)
If you pass in User_Defined, then the generator will create C++ stubs that you have to befill manuall...
Preprocess the solution and reconstruct halo for this.
set_implementation(self, flux=None, ncp=None, source_term=None, eigenvalues=None, boundary_conditions=None, refinement_criterion=None, initial_conditions=None, memory_location=None, additional_action_set_includes="", additional_user_includes="", KOSigma=None)
If you pass in User_Defined, then the generator will create C++ stubs that you have to befill manuall...
update_solver_parameters_for_single_black_hole(solver)
Update preconfigured solver parameters.