Peano
Loading...
Searching...
No Matches
DynamicAMR.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3from .AbstractADERDGActionSet import AbstractADERDGActionSet
4
5import jinja2
6import peano4.solversteps
7
8
10 """
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.
14 """
15
17 self,
18 solver,
19 delete_guard="false",
20 interpolate_guard="false",
21 restrict_guard="false",
22 ):
23 super(DynamicAMR, self).__init__(solver)
24 self._delete_guard = delete_guard
25 self._interpolate_guard = interpolate_guard
26 self._restrict_guard = restrict_guard
27
29 if ({{INTERPOLATE_GUARD}}) {
30 const double timeStamp = fineGridFace{{SOLVER_NAME}}FaceLabel.getNewTimeStamp(marker.getSelectedFaceNumber() < Dimensions ? 1 : 0);
31
32 // Needs to declare and define timeStepSize
33 {{COMPUTE_TIME_STEP_SIZE}}
34
35 #if Dimensions == 2
36 constexpr int SpaceFaceSize = {{ORDER}} + 1;
37 #else
38 constexpr int SpaceFaceSize = ({{ORDER}} + 1) * ({{ORDER}} + 1);
39 #endif
40
41 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : SpaceFaceSize;
42
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()
51 );
52 }
53
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)));
58 }
59"""
60
62 #if Dimensions == 2
63 constexpr int SpaceFaceSize = {{ORDER}} + 1;
64 #else
65 constexpr int SpaceFaceSize = ({{ORDER}} + 1) * ({{ORDER}} + 1);
66 #endif
67
68 constexpr int FluxElementsPerFace = SpaceFaceSize * {{NUMBER_OF_UNKNOWNS}};
69
70 if ({{DELETE_GUARD}}) {
71
72 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : 1;
73 auto* FOut = coarseGridFaces{{SOLVER_NAME}}QFluxEstimates(marker.getSelectedFaceNumber()).value + (1-facePosition) * FluxElementsPerFace;
74
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);
78 }
79
80 if ({{RESTRICT_GUARD}}) {
81
82 int facePosition = marker.getSelectedFaceNumber() < Dimensions ? 0 : 1;
83
84 // Fluxes
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
89 );
90 }
91"""
92
94 logTraceIn( "createCell(...)" );
95
96 kernels::{{SOLVER_NAME}}::cellUnknownsProlongation(
97 fineGridCell{{SOLVER_NAME}}Q.value,
98 coarseGridCell{{SOLVER_NAME}}Q.value,
99 marker.getRelativePositionWithinFatherCell()
100 );
101
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() );
104
105 logTraceOut( "createCell(...)" );
106"""
107
109 logTraceInWith1Argument( "destroyCell(...)", marker.toString() );
110
111 kernels::{{SOLVER_NAME}}::cellUnknownsRestriction(
112 fineGridCell{{SOLVER_NAME}}Q.value,
113 coarseGridCell{{SOLVER_NAME}}Q.value,
114 marker.getRelativePositionWithinFatherCell()
115 );
116
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() );
119
120 logTraceOut( "destroyCell(...)" );
121"""
122
124 return __name__.replace(".py", "").replace(".", "_")
125
126 def get_body_of_operation(self, operation_name):
127 result = "\n"
128 d = {}
129 self._solver._init_dictionary_with_default_parameters(d)
130 self._solver.add_entries_to_text_replacement_dictionary(d)
131
132 if operation_name == peano4.solversteps.ActionSet.OPERATION_CREATE_HANGING_FACE:
133 d["INTERPOLATE_GUARD"] = self._interpolate_guard
134 result = jinja2.Template(self._Template_CreateHangingFace).render(**d)
135 pass
136 if (
137 operation_name
138 == peano4.solversteps.ActionSet.OPERATION_DESTROY_HANGING_FACE
139 ):
140 d["DELETE_GUARD"] = self._delete_guard
141 d["RESTRICT_GUARD"] = self._restrict_guard
142 result = jinja2.Template(self._Template_DestroyHangingFace).render(**d)
143 pass
144 if operation_name==peano4.solversteps.ActionSet.OPERATION_CREATE_CELL:
145 result = jinja2.Template(self._Template_CreateCell).render(**d)
146 pass
147 if operation_name==peano4.solversteps.ActionSet.OPERATION_DESTROY_CELL:
148 result = jinja2.Template(self._Template_DestroyCell).render(**d)
149 pass
150 return result
151
152 def get_includes(self):
153 return (
154 super(DynamicAMR, self).get_includes()
155 + """
156#include "kernels/"""
157 + self._solver._name
158 + """/AMRRoutines.h"
159"""
160 )
ExaHyPE 2 ADER-DG handling of adaptive meshes.
Definition DynamicAMR.py:9
__init__(self, solver, delete_guard="false", interpolate_guard="false", restrict_guard="false")
Definition DynamicAMR.py:22
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.