3from .AbstractADERDGActionSet
import AbstractADERDGActionSet
6import peano4.solversteps
11 ExaHyPE 2 ADER-DG handling of adaptive meshes.
12 Despite the name this currently only handles static AMR,
13 so this probably desperately needs to be renamed.
20 interpolate_guard="false",
21 restrict_guard="false",
23 super(DynamicAMR, self).
__init__(solver)
29 if ({{INTERPOLATE_GUARD}}) {
30 const double timeStamp = fineGridFace{{SOLVER_NAME}}FaceLabel.getNewTimeStamp(marker.getSelectedFaceNumber() < Dimensions ? 1 : 0);
32 // Needs to declare and define timeStepSize
33 {{COMPUTE_TIME_STEP_SIZE}}
36 constexpr int SpaceFaceSize = {{ORDER}} + 1;
38 constexpr int SpaceFaceSize = ({{ORDER}} + 1) * ({{ORDER}} + 1);
41 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : SpaceFaceSize;
43 if (!marker.isInteriorFaceWithinPatch()) {
44 // Interpolate both estimates and fluxes
45 kernels::{{SOLVER_NAME}}::faceUnknownsProlongation(
46 fineGridFace{{SOLVER_NAME}}QEstimates.value + facePosition * ({{NUMBER_OF_UNKNOWNS}} + {{NUMBER_OF_AUXILIARY_VARIABLES}}),
47 fineGridFace{{SOLVER_NAME}}QFluxEstimates.value + facePosition * {{NUMBER_OF_UNKNOWNS}},
48 coarseGridFaces{{SOLVER_NAME}}QEstimates(marker.getSelectedFaceNumber()).value + facePosition * ({{NUMBER_OF_UNKNOWNS}} + {{NUMBER_OF_AUXILIARY_VARIABLES}}),
49 coarseGridFaces{{SOLVER_NAME}}QFluxEstimates(marker.getSelectedFaceNumber()).value + facePosition * {{NUMBER_OF_UNKNOWNS}},
50 marker.getRelativePositionWithinFatherFace()
54 fineGridFace{{SOLVER_NAME}}FaceLabel.setNewTimeStamp(0, std::max(coarseGridFaces{{SOLVER_NAME}}FaceLabel(marker.getSelectedFaceNumber()).getNewTimeStamp(0), fineGridFace{{SOLVER_NAME}}FaceLabel.getNewTimeStamp(0)));
55 fineGridFace{{SOLVER_NAME}}FaceLabel.setNewTimeStamp(1, std::max(coarseGridFaces{{SOLVER_NAME}}FaceLabel(marker.getSelectedFaceNumber()).getNewTimeStamp(1), fineGridFace{{SOLVER_NAME}}FaceLabel.getNewTimeStamp(1)));
56 fineGridFace{{SOLVER_NAME}}FaceLabel.setOldTimeStamp(0, std::max(coarseGridFaces{{SOLVER_NAME}}FaceLabel(marker.getSelectedFaceNumber()).getOldTimeStamp(0), fineGridFace{{SOLVER_NAME}}FaceLabel.getOldTimeStamp(0)));
57 fineGridFace{{SOLVER_NAME}}FaceLabel.setOldTimeStamp(1, std::max(coarseGridFaces{{SOLVER_NAME}}FaceLabel(marker.getSelectedFaceNumber()).getOldTimeStamp(1), fineGridFace{{SOLVER_NAME}}FaceLabel.getOldTimeStamp(1)));
63 constexpr int SpaceFaceSize = {{ORDER}} + 1;
65 constexpr int SpaceFaceSize = ({{ORDER}} + 1) * ({{ORDER}} + 1);
68 constexpr int FluxElementsPerFace = SpaceFaceSize * {{NUMBER_OF_UNKNOWNS}};
70 if ({{DELETE_GUARD}}) {
72 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : 1;
73 auto* FOut = coarseGridFaces{{SOLVER_NAME}}QFluxEstimates(marker.getSelectedFaceNumber()).value + (1-facePosition) * FluxElementsPerFace;
75 //Delete the elements on the side of the face that the Riemann fluxes will be merged onto. Because of the
76 // merge operations this must be on the side on which the fine cells are.
77 std::fill_n(FOut, FluxElementsPerFace, 0.0);
80 if ({{RESTRICT_GUARD}}) {
82 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : 1;
85 kernels::{{SOLVER_NAME}}::faceFluxRestriction(
86 coarseGridFaces{{SOLVER_NAME}}QFluxEstimates(marker.getSelectedFaceNumber()).value + (1-facePosition) * FluxElementsPerFace, // const double* lQhbndCoarse
87 fineGridFace{{SOLVER_NAME}}QFluxEstimates.value + facePosition * FluxElementsPerFace, // double* lQhbndFine
88 marker.getRelativePositionWithinFatherFace() // const tarch::la::Vector<Dimensions - 1, int>& subfaceIndex
94 logTraceIn( "createCell(...)" );
96 kernels::{{SOLVER_NAME}}::cellUnknownsProlongation(
97 fineGridCell{{SOLVER_NAME}}Q.value,
98 coarseGridCell{{SOLVER_NAME}}Q.value,
99 marker.getRelativePositionWithinFatherCell()
102 fineGridCell""" + solver._cell_label.name +
""".setTimeStamp( coarseGridCell""" + solver._cell_label.name +
""".getTimeStamp() );
103 fineGridCell""" + solver._cell_label.name +
""".setTimeStepSize( coarseGridCell""" + solver._cell_label.name +
""".getTimeStepSize() );
105 logTraceOut( "createCell(...)" );
109 logTraceInWith1Argument( "destroyCell(...)", marker.toString() );
111 kernels::{{SOLVER_NAME}}::cellUnknownsRestriction(
112 fineGridCell{{SOLVER_NAME}}Q.value,
113 coarseGridCell{{SOLVER_NAME}}Q.value,
114 marker.getRelativePositionWithinFatherCell()
117 coarseGridCell""" + solver._cell_label.name +
""".setTimeStamp( fineGridCell""" + solver._cell_label.name +
""".getTimeStamp() );
118 coarseGridCell""" + solver._cell_label.name +
""".setTimeStepSize( fineGridCell""" + solver._cell_label.name +
""".getTimeStepSize() );
120 logTraceOut( "destroyCell(...)" );
124 return __name__.replace(
".py",
"").replace(
".",
"_")
129 self.
_solver._init_dictionary_with_default_parameters(d)
130 self.
_solver.add_entries_to_text_replacement_dictionary(d)
132 if operation_name == peano4.solversteps.ActionSet.OPERATION_CREATE_HANGING_FACE:
138 == peano4.solversteps.ActionSet.OPERATION_DESTROY_HANGING_FACE
144 if operation_name==peano4.solversteps.ActionSet.OPERATION_CREATE_CELL:
147 if operation_name==peano4.solversteps.ActionSet.OPERATION_DESTROY_CELL:
ExaHyPE 2 ADER-DG handling of adaptive meshes.
__init__(self, solver, delete_guard="false", interpolate_guard="false", restrict_guard="false")
_Template_DestroyHangingFace
_Template_CreateHangingFace
get_includes(self)
Return include statements that you need.
get_action_set_name(self)
You should replicate this function in each subclass, so you get meaningful action set names (otherwis...
get_body_of_operation(self, operation_name)
Return actual C++ code snippets to be inserted into C++ code.