11 This class assumes that you have an 2MxNxN patch on your faces.
13 patch: peano4.datamodel.Patch
15 patch_overlap_interpolation: peano4.datamodel.Patch
16 Consult remark above about how the dimensions of this overlap
17 patch have to match. This overlap is used for the
18 interpolation. It can be the same as for the restriction.
20 patch_overlap_restriction: peano4.datamodel.Patch
27 patch_overlap_interpolation,
28 patch_overlap_restriction,
32 restrict_guard="true",
33 interpolate_guard="true",
34 additional_includes=""
38 restrict_guard: String
39 Predicate as C++ expression. It determines which faces are cleared.
41 interpolation_scheme: String
42 This is a string that is used to assemble the interpolation scheme that
43 is actually used. At the moment, I mainly offer three variants here:
46 - linear_precomputed_operators<3>. The 3 has to be replaced by the
47 number of unknowns that you use per coordinate axis.
50 super(DynamicAMR,self).
__init__(descend_invocation_order=1,parallel=
False)
52 if patch_overlap_interpolation.dim[0] % 2 != 0:
53 raise Exception(
"Error: Patch associated to face has to have even number of cells. Otherwise, it is not a symmetric overlap." )
54 if patch_overlap_interpolation.dim != patch_overlap_restriction.dim:
55 raise Exception(
"Error: Patches associated to face have to have same dimensions for restriction and interpolation." )
57 self.
d[
"UNKNOWNS" ] = str(patch_overlap_interpolation.no_of_unknowns)
58 self.
d[
"DOFS_PER_AXIS" ] = str(patch_overlap_interpolation.dim[1])
59 self.
d[
"OVERLAP" ] = str(
int(patch_overlap_interpolation.dim[0]/2))
60 self.
d[
"FINE_GRID_CELL" ] =
"fineGridCell" + patch.name
61 self.
d[
"COARSE_GRID_CELL" ] =
"coarseGridCell" + patch.name
62 self.
d[
"FINE_GRID_FACE_ACCESSOR_INTERPOLATION" ] =
"fineGridFace" + patch_overlap_interpolation.name
63 self.
d[
"COARSE_GRID_FACE_ACCESSOR_INTERPOLATION" ] =
"coarseGridFaces" + patch_overlap_interpolation.name
64 self.
d[
"FINE_GRID_FACE_ACCESSOR_RESTRICTION" ] =
"fineGridFace" + patch_overlap_restriction.name
65 self.
d[
"COARSE_GRID_FACE_ACCESSOR_RESTRICTION" ] =
"coarseGridFaces" + patch_overlap_restriction.name
66 self.
d[
"INTERPOLATION_SCHEME" ] = interpolation_scheme
67 self.
d[
"RESTRICTION_SCHEME" ] = restriction_scheme
68 self.
d[
"CLEAR_GUARD" ] = clear_guard
69 self.
d[
"RESTRICT_GUARD" ] = restrict_guard
70 self.
d[
"INTERPOLATE_GUARD" ] = interpolate_guard
84 return " return std::vector< peano4::grid::GridControlEvent >();\n"
88 return __name__.replace(
".py",
"").replace(
".",
"_")
95 _Template_TouchFaceFirstTime =
"""
96 if ( {{CLEAR_GUARD}} ) {
97 logTraceInWith2Arguments( "touchFaceFirstTime(...)", marker.toString(), "clear halo layer {{FINE_GRID_FACE_ACCESSOR_RESTRICTION}}" );
99 ::toolbox::blockstructured::clearHaloLayerAoS(
104 {{FINE_GRID_FACE_ACCESSOR_RESTRICTION}}.value
107 logTraceOut( "touchFaceFirstTime(...)" );
112 _Template_TouchCellFirstTime =
"""
113 if ( marker.hasBeenRefined() and not marker.willBeRefined() ) {
114 logTraceInWith2Arguments( "touchCellFirstTime(...)", marker.toString(), "clear cell {{FINE_GRID_CELL}}" );
116 ::toolbox::blockstructured::clearCell(
120 {{FINE_GRID_CELL}}.value
123 logTraceOut( "touchCellFirstTime(...)" );
128 _Template_CreateHangingFace =
"""
129 if ( {{INTERPOLATE_GUARD}} ) {
130 logTraceInWith1Argument( "createHangingFace(...)", marker.toString() );
132 ::toolbox::blockstructured::interpolateHaloLayer_AoS_{{INTERPOLATION_SCHEME}}(
137 {{COARSE_GRID_FACE_ACCESSOR_INTERPOLATION}}(marker.getSelectedFaceNumber()).value,
138 {{FINE_GRID_FACE_ACCESSOR_INTERPOLATION}}.value
141 logTraceOut( "createHangingFace(...)" );
144 logDebug( "createHangingFace(...)", "skip interpolation for " << marker.toString() << " as interpolation guard did not yield true" );
149 _Template_DestroyHangingFace =
"""
150 if ( {{RESTRICT_GUARD}} ) {
151 logTraceInWith4Arguments( "destroyHangingFace(...)", "{{FINE_GRID_FACE_ACCESSOR_RESTRICTION}}", "{{COARSE_GRID_FACE_ACCESSOR_RESTRICTION}}", marker.getSelectedFaceNumber(), marker.toString() );
153 ::toolbox::blockstructured::restrictInnerHalfOfHaloLayer_AoS_{{RESTRICTION_SCHEME}}(
158 {{FINE_GRID_FACE_ACCESSOR_RESTRICTION}}.value,
159 {{COARSE_GRID_FACE_ACCESSOR_RESTRICTION}}(marker.getSelectedFaceNumber()).value
162 logTraceOut( "destroyHangingFace(...)" );
170 _Template_CreatePersistentFace =
"""
171 logTraceInWith1Argument( "createPersistentFace(...)", marker.toString() );
173 ::toolbox::blockstructured::interpolateHaloLayer_AoS_{{INTERPOLATION_SCHEME}}(
178 {{COARSE_GRID_CELL}}.value,
179 {{COARSE_GRID_FACE_ACCESSOR_INTERPOLATION}}(marker.getSelectedFaceNumber()).value,
180 {{FINE_GRID_FACE_ACCESSOR_INTERPOLATION}}.value
183 logTraceOutWith1Argument( "createPersistentFace(...)", marker.toString() );
187 _Template_DestroyPersistentFace =
"""
188 if ( not marker.isInteriorFaceWithinPatch() ) {
189 logTraceIn( "destroyPersistentFace(...)" );
191 ::toolbox::blockstructured::restrictHaloLayer_AoS_{{RESTRICTION_SCHEME}}(
196 {{FINE_GRID_FACE_ACCESSOR_RESTRICTION}}.value,
197 {{COARSE_GRID_FACE_ACCESSOR_RESTRICTION}}(marker.getSelectedFaceNumber()).value
200 logTraceOut( "destroyPersistentFace(...)" );
205 _Template_CreateCell =
"""
206 logTraceIn( "createCell(...)" );
208 ::toolbox::blockstructured::interpolateCell_AoS_{{INTERPOLATION_SCHEME}}(
212 {{COARSE_GRID_CELL}}.value,
213 {{FINE_GRID_CELL}}.value
216 logTraceOut( "createCell(...)" );
220 _Template_DestroyCell =
"""
221 logTraceInWith1Argument( "destroyCell(...)", marker.toString() );
223 ::toolbox::blockstructured::restrictCell_AoS_{{RESTRICTION_SCHEME}}(
227 {{FINE_GRID_CELL}}.value,
228 {{COARSE_GRID_CELL}}.value
231 logTraceOut( "destroyCell(...)" );
237 if operation_name==ActionSet.OPERATION_CREATE_HANGING_FACE:
240 if operation_name==ActionSet.OPERATION_CREATE_PERSISTENT_FACE:
243 if operation_name==ActionSet.OPERATION_DESTROY_HANGING_FACE:
246 if operation_name==ActionSet.OPERATION_DESTROY_PERSISTENT_FACE:
249 if operation_name==ActionSet.OPERATION_CREATE_CELL:
252 if operation_name==ActionSet.OPERATION_DESTROY_CELL:
255 if operation_name==ActionSet.OPERATION_TOUCH_FACE_FIRST_TIME:
258 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
270#include "peano4/utils/Loop.h"
271#include "toolbox/blockstructured/Enumeration.h"
272#include "toolbox/blockstructured/Interpolation.h"
273#include "toolbox/blockstructured/Restriction.h"
278 return self.
d[
"CLEAR_GUARD" ]
282 return self.
d[
"RESTRICT_GUARD" ]
286 return self.
d[
"INTERPOLATE_GUARD" ]
290 self.
d[
"INTERPOLATION_SCHEME" ] = interpolation_scheme
294 self.
d[
"RESTRICTION_SCHEME" ] = restriction_scheme
Action set (reactions to events)