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.
30 result.generator.load_store_compute_flag =
"::peano4::grid::constructLoadStoreComputeFlag({},{},{})".format(
31 "true",
"true",
"true" )
33 result.generator.send_condition =
"true"
34 result.generator.receive_and_merge_condition =
"true"
36 result.peano4_mpi_and_storage_aspect.merge_implementation +=
"""
37 _NewAverage += neighbour._NewAverage;
46 relaxation_coefficient,
48 unknown_setter=
"setU",
49 unknown_getter=
"getU",
56 vertex_data: DaStGen object
57 This object must have at least two attributes: A double value u and a double
60 kappa_expr: C++ code (string)
61 Material parameter. Pass in 1.0 if there's no jump anywhere.
65 assert relaxation_coefficient>0.0,
"Relaxation coefficient has to be positive"
66 assert relaxation_coefficient<2.0,
"Relaxation coefficient has to be smaller than 2"
69 self.
d[
"CELL_NAME" ] = cell_data.name
70 self.
d[
"FACE_NAME" ] = face_data.name
71 self.
d[
"UNKNOWN_SETTER" ] = unknown_setter
72 self.
d[
"UNKNOWN_GETTER" ] = unknown_getter
73 self.
d[
"OMEGA" ] = relaxation_coefficient
74 self.
d[
"RHS" ] = rhs_expr
75 self.
d[
"GUARD" ] = guard
80 return " return std::vector< peano4::grid::GridControlEvent >();\n"
84 return __name__.replace(
".py",
"").replace(
".",
"_")
95 _Template_CreateCell=
"""
96 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}(0.0);
99 _Template_CreatePersistentFace =
"""
100 fineGridFace{{FACE_NAME}}.setNewAverage(0.0);
101 fineGridFace{{FACE_NAME}}.setOldAverage(0.0);
104 _Template_CreateHangingFace =
"""
105 auto coarseValue = coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getOldAverage();
107 fineGridFace{{FACE_NAME}}.setOldAverage( coarseValue );
108 fineGridFace{{FACE_NAME}}.setNewAverage( coarseValue );
111 _Template_DestroyHangingFace =
"""
112 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).setNewAverage(
113 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getNewAverage()
115 ThreePowerD/3.0 * fineGridFace{{FACE_NAME}}.getNewAverage()
119 _Template_TouchFaceFirstTime =
"""
120 fineGridFace{{FACE_NAME}}.setOldAverage( fineGridFace{{FACE_NAME}}.getNewAverage() );
121 fineGridFace{{FACE_NAME}}.setNewAverage( 0.0 );
125 _Template_TouchCellFirstTime_UpdateSolution =
"""
126 // @todo Das ist nicht schoen. Ich haette hier gerne nen allgemeinen Stencil
129 double diagonal = 0.0;
130 double residual = {{RHS}};
132 double centralValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}();
134 for (int d=0; d<Dimensions; d++) {
135 double leftNeighbour = 2.0 * (fineGridFaces{{FACE_NAME}}(d).getOldAverage() - 0.5 * centralValue);
136 double rightNeighbour = 2.0 * (fineGridFaces{{FACE_NAME}}(d+Dimensions).getOldAverage() - 0.5 * centralValue);
138 residual -= (-1.0 * leftNeighbour + 2.0 * centralValue - 1.0 * rightNeighbour) / marker.h()(d) / marker.h()(d);
139 diagonal += (2.0) / marker.h()(d) / marker.h()(d);
142 double newValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}() + {{OMEGA}} / diagonal * residual;
144 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}( newValue );
149 _Template_TouchCellFirstTime_UpdateFaceHelperData =
"""
150 for (int d=0; d<Dimensions; d++) {
151 const double newValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}();
152 fineGridFaces{{FACE_NAME}}(d).setNewAverage( fineGridFaces{{FACE_NAME}}(d).getNewAverage() + 0.5 * newValue );
153 fineGridFaces{{FACE_NAME}}(d+Dimensions).setNewAverage( fineGridFaces{{FACE_NAME}}(d+Dimensions).getNewAverage() + 0.5 * newValue );
160 if operation_name==ActionSet.OPERATION_CREATE_CELL:
162 if operation_name==ActionSet.OPERATION_CREATE_HANGING_FACE:
164 if operation_name==ActionSet.OPERATION_CREATE_PERSISTENT_FACE:
166 if operation_name==ActionSet.OPERATION_TOUCH_FACE_FIRST_TIME:
168 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
171 if operation_name==ActionSet.OPERATION_DESTROY_HANGING_FACE:
178 toolbox::finiteelements::ElementWiseAssemblyMatrix _cellStiffnessMatrix;
184#include "toolbox/finiteelements/ElementMatrix.h"
185#include "toolbox/finiteelements/StencilFactory.h"
187#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)