17 We cannot access neighbouring cells within Peano. Therefore, we have
18 to store helper data on the faces such that we can reconstruct the
19 value within the face-connected neighbours.
29 result.generator.load_store_compute_flag =
"::peano4::grid::constructLoadStoreComputeFlag({},{},{})".format(
30 "true",
"true",
"true" )
32 result.generator.send_condition =
"true"
33 result.generator.receive_and_merge_condition =
"true"
35 result.peano4_mpi_and_storage_aspect.merge_implementation +=
"""
36 _NewAverage += neighbour._NewAverage;
45 relaxation_coefficient,
47 unknown_setter=
"setU",
48 unknown_getter=
"getU",
55 vertex_data: DaStGen object
56 This object must have at least two attributes: A double value u and a double
59 kappa_expr: C++ code (string)
60 Material parameter. Pass in 1.0 if there's no jump anywhere.
64 assert relaxation_coefficient>0.0,
"Relaxation coefficient has to be positive"
65 assert relaxation_coefficient<2.0,
"Relaxation coefficient has to be smaller than 2"
68 self.
d[
"CELL_NAME" ] = cell_data.name
69 self.
d[
"FACE_NAME" ] = face_data.name
70 self.
d[
"UNKNOWN_SETTER" ] = unknown_setter
71 self.
d[
"UNKNOWN_GETTER" ] = unknown_getter
72 self.
d[
"OMEGA" ] = relaxation_coefficient
73 self.
d[
"RHS" ] = rhs_expr
74 self.
d[
"GUARD" ] = guard
79 return " return std::vector< peano4::grid::GridControlEvent >();\n"
83 return __name__.replace(
".py",
"").replace(
".",
"_")
94 _Template_CreateCell=
"""
95 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}(0.0);
98 _Template_CreatePersistentFace =
"""
99 fineGridFace{{FACE_NAME}}.setNewAverage(0.0);
100 fineGridFace{{FACE_NAME}}.setOldAverage(0.0);
103 _Template_CreateHangingFace =
"""
104 auto coarseValue = coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getOldAverage();
106 fineGridFace{{FACE_NAME}}.setOldAverage( coarseValue );
107 fineGridFace{{FACE_NAME}}.setNewAverage( coarseValue );
110 _Template_DestroyHangingFace =
"""
111 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).setNewAverage(
112 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getNewAverage()
114 ThreePowerD/3.0 * fineGridFace{{FACE_NAME}}.getNewAverage()
118 _Template_TouchFaceFirstTime =
"""
119 fineGridFace{{FACE_NAME}}.setOldAverage( fineGridFace{{FACE_NAME}}.getNewAverage() );
120 fineGridFace{{FACE_NAME}}.setNewAverage( 0.0 );
124 _Template_TouchCellFirstTime_UpdateSolution =
"""
125 // @todo Das ist nicht schoen. Ich haette hier gerne nen allgemeinen Stencil
128 double diagonal = 0.0;
129 double residual = {{RHS}};
131 double centralValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}();
133 for (int d=0; d<Dimensions; d++) {
134 double leftNeighbour = 2.0 * (fineGridFaces{{FACE_NAME}}(d).getOldAverage() - 0.5 * centralValue);
135 double rightNeighbour = 2.0 * (fineGridFaces{{FACE_NAME}}(d+Dimensions).getOldAverage() - 0.5 * centralValue);
137 residual -= (-1.0 * leftNeighbour + 2.0 * centralValue - 1.0 * rightNeighbour) / marker.h()(d) / marker.h()(d);
138 diagonal += (2.0) / marker.h()(d) / marker.h()(d);
141 double newValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}() + {{OMEGA}} / diagonal * residual;
143 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}( newValue );
148 _Template_TouchCellFirstTime_UpdateFaceHelperData =
"""
149 for (int d=0; d<Dimensions; d++) {
150 const double newValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}();
151 fineGridFaces{{FACE_NAME}}(d).setNewAverage( fineGridFaces{{FACE_NAME}}(d).getNewAverage() + 0.5 * newValue );
152 fineGridFaces{{FACE_NAME}}(d+Dimensions).setNewAverage( fineGridFaces{{FACE_NAME}}(d+Dimensions).getNewAverage() + 0.5 * newValue );
159 if operation_name==ActionSet.OPERATION_CREATE_CELL:
161 if operation_name==ActionSet.OPERATION_CREATE_HANGING_FACE:
163 if operation_name==ActionSet.OPERATION_CREATE_PERSISTENT_FACE:
165 if operation_name==ActionSet.OPERATION_TOUCH_FACE_FIRST_TIME:
167 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
170 if operation_name==ActionSet.OPERATION_DESTROY_HANGING_FACE:
177 toolbox::finiteelements::ElementWiseAssemblyMatrix _cellStiffnessMatrix;
183#include "toolbox/finiteelements/ElementMatrix.h"
184#include "toolbox/finiteelements/StencilFactory.h"
186#include "peano4/utils/Loop.h"
cardinality is a string (you can thus use symbols as well as long as they will be defined at compile ...
Default superclass for any data model in Peano which is stored within the grid.
Action set (reactions to events)