14 relaxation_coefficient,
16 unknown_setter="setU",
17 unknown_getter="getU",
18 residual_setter="setResidual",
19 residual_getter="getResidual",
20 store_residual_persistently_and_update_in_touch_first = True,
27 vertex_data: DaStGen object
28 This object must have at least two attributes: A double value u and a double
31 kappa_expr: C++ code (string)
32 Material parameter. Pass in 1.0 if there's no jump anywhere.
37 self.
d[
"UNKNOWN" ] = vertex_data.name
38 self.
d[
"UNKNOWN_SETTER" ] = unknown_setter
39 self.
d[
"UNKNOWN_GETTER" ] = unknown_getter
40 self.
d[
"RESIDUAL_SETTER" ] = residual_setter
41 self.
d[
"RESIDUAL_GETTER" ] = residual_getter
42 self.
d[
"OMEGA" ] = relaxation_coefficient
43 self.
d[
"RHS" ] = rhs_expr
44 self.
d[
"GUARD" ] = guard
50 return " return std::vector< peano4::grid::GridControlEvent >();\n"
54 return __name__.replace(
".py",
"").replace(
".",
"_")
61 __Template_Constructor = jinja2.Template(
"""
62 _cellStiffnessMatrix = toolbox::finiteelements::StencilFactory::getLaplacian( 0.0, 1.0 );
70 Template_ResetResidual =
"""
71 fineGridVertex{{UNKNOWN}}.{{RESIDUAL_SETTER}}(0.0);
77 This is where you should interpolate
79 @todo Einbauen! Obwohl wir wissen, dass es ueberschrieben wird
82 Template_CreateHangingVertex =
"""
83 fineGridVertex{{UNKNOWN}}.{{RESIDUAL_SETTER}}(0.0);
87 Template_TouchCellFirstTime =
"""
88 const tarch::la::Vector<ThreePowerD,double> stencil = toolbox::finiteelements::getLaplacian(
91 const toolbox::finiteelements::ElementWiseAssemblyMatrix A = toolbox::finiteelements::getElementWiseAssemblyMatrix(
95 tarch::la::Vector<TwoPowerD,double> u;
96 for (int i=0; i<TwoPowerD; i++) {
97 u(i) = fineGridVertices{{UNKNOWN}}(i).{{UNKNOWN_GETTER}}();
100 tarch::la::Vector<TwoPowerD,double> r = A * u;
102 for (int i=0; i<TwoPowerD; i++) {
103 fineGridVertices{{UNKNOWN}}(i).{{RESIDUAL_SETTER}}(
104 fineGridVertices{{UNKNOWN}}(i).{{RESIDUAL_GETTER}}() + r(i)
110 Template_UpdateValue =
"""
111 const tarch::la::Vector<ThreePowerD,double> stencil = toolbox::finiteelements::getLaplacian(
114 const double diag = stencil(ThreePowerD/2);
115 const double residual = {{RHS}} * tarch::la::volume(marker.h()) - fineGridVertex{{UNKNOWN}}.{{RESIDUAL_GETTER}}();
116 fineGridVertex{{UNKNOWN}}.{{UNKNOWN_SETTER}}(
117 fineGridVertex{{UNKNOWN}}.{{UNKNOWN_GETTER}}()
119 {{OMEGA}} * residual / diag
122 if ( marker.coincidesWithCoarseGridVertex() ) {
123 tarch::la::Vector<Dimensions,int> parent = marker.getRelativePositionWithinFatherCell() / 3;
124 coarseGridVertices{{UNKNOWN}}( peano4::utils::dLinearised(parent,2) ).{{UNKNOWN_SETTER}}(
125 fineGridVertex{{UNKNOWN}}.{{UNKNOWN_GETTER}}()
131 Template_CreatePersistentVertex =
"""
136 if operation_name==ActionSet.OPERATION_TOUCH_VERTEX_FIRST_TIME:
138logTraceIn( "touchVertexFirstTime()" );
144logTraceOut( "touchVertexFirstTime()" );
146 if operation_name==ActionSet.OPERATION_CREATE_HANGING_VERTEX:
148logTraceIn( "createHangingVertex()" );
152logTraceOut( "createHangingVertex()" );
154 if operation_name==ActionSet.OPERATION_CREATE_PERSISTENT_VERTEX:
156logTraceIn( "createPersistentVertex()" );
160logTraceOut( "createPersistentVertex()" );
162 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
164logTraceIn( "touchCellFirstTime()" );
168logTraceOut( "touchCellFirstTime()" );
170 if operation_name==ActionSet.OPERATION_TOUCH_VERTEX_LAST_TIME:
172logTraceIn( "touchVertexLastTime()" );
177logTraceOut( "touchVertexLastTime()" );
183 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
184 return self.
d[
"GUARD" ]
190 toolbox::finiteelements::ElementWiseAssemblyMatrix _cellStiffnessMatrix;
196#include "toolbox/finiteelements/ElementMatrix.h"
197#include "toolbox/finiteelements/StencilFactory.h"
199#include "peano4/utils/Loop.h"
Action set (reactions to events)