Peano
Loading...
Searching...
No Matches
ScalarJacobiWithRediscretisation.py
Go to the documentation of this file.
1# This file is part of the Peano project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3from peano4.solversteps.ActionSet import ActionSet
4
5
6import jinja2
7import peano4
8import dastgen2
9
10
12
13
14 def construct_face_helper_data(cell_data_model: peano4.datamodel.DaStGen2):
15 """
16
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.
20
21 cell_data_mode:
22
23 """
24 result = peano4.datamodel.DaStGen2( cell_data_model.name )
25
26 result.data.add_attribute(dastgen2.attributes.Double("OldAverage") )
27 result.data.add_attribute(dastgen2.attributes.Double("NewAverage") )
28
29 result.generator.load_store_compute_flag = "::peano4::grid::constructLoadStoreComputeFlag({},{},{})".format(
30 "true", "true", "true" )
31
32 result.generator.send_condition = "true"
33 result.generator.receive_and_merge_condition = "true"
34
35 result.peano4_mpi_and_storage_aspect.merge_implementation += """
36 _NewAverage += neighbour._NewAverage;
37"""
38
39 return result
40
41
42 def __init__(self,
43 cell_data: peano4.datamodel.DaStGen2,
44 face_data: peano4.datamodel.DaStGen2,
45 relaxation_coefficient,
46 rhs_expr,
47 unknown_setter="setU",
48 unknown_getter="getU",
49 guard="true"
50 ):
51 """
52
53 :Attibutes:
54
55 vertex_data: DaStGen object
56 This object must have at least two attributes: A double value u and a double
57 value residual.
58
59 kappa_expr: C++ code (string)
60 Material parameter. Pass in 1.0 if there's no jump anywhere.
61
62
63 """
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"
66
67 self.d = {}
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
76
77
79 return " return std::vector< peano4::grid::GridControlEvent >();\n"
80
81
83 return __name__.replace(".py", "").replace(".", "_")
84
85
87 return False
88
89
90 #def get_constructor_body(self):
91 # return self.__Template_Constructor.format(**self.d)
92
93
94 _Template_CreateCell= """
95 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}(0.0);
96"""
97
98 _Template_CreatePersistentFace = """
99 fineGridFace{{FACE_NAME}}.setNewAverage(0.0);
100 fineGridFace{{FACE_NAME}}.setOldAverage(0.0);
101"""
102
103 _Template_CreateHangingFace = """
104 auto coarseValue = coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getOldAverage();
105
106 fineGridFace{{FACE_NAME}}.setOldAverage( coarseValue );
107 fineGridFace{{FACE_NAME}}.setNewAverage( coarseValue );
108"""
109
110 _Template_DestroyHangingFace = """
111 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).setNewAverage(
112 coarseGridFaces{{FACE_NAME}}( marker.getSelectedFaceNumber() ).getNewAverage()
113 +
114 ThreePowerD/3.0 * fineGridFace{{FACE_NAME}}.getNewAverage()
115 );
116"""
117
118 _Template_TouchFaceFirstTime = """
119 fineGridFace{{FACE_NAME}}.setOldAverage( fineGridFace{{FACE_NAME}}.getNewAverage() );
120 fineGridFace{{FACE_NAME}}.setNewAverage( 0.0 );
121"""
122
123
124 _Template_TouchCellFirstTime_UpdateSolution = """
125 // @todo Das ist nicht schoen. Ich haette hier gerne nen allgemeinen Stencil
126
127 if ({{GUARD}}) {
128 double diagonal = 0.0;
129 double residual = {{RHS}};
130
131 double centralValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}();
132
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);
136
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);
139 }
140
141 double newValue = fineGridCell{{CELL_NAME}}.{{UNKNOWN_GETTER}}() + {{OMEGA}} / diagonal * residual;
142
143 fineGridCell{{CELL_NAME}}.{{UNKNOWN_SETTER}}( newValue );
144 }
145"""
146
147
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 );
153 }
154"""
155
156
157 def get_body_of_operation(self,operation_name):
158 result = "\n"
159 if operation_name==ActionSet.OPERATION_CREATE_CELL:
160 result = jinja2.Template(self._Template_CreateCell).render(**self.d)
161 if operation_name==ActionSet.OPERATION_CREATE_HANGING_FACE:
162 result = jinja2.Template(self._Template_CreateHangingFace).render(**self.d)
163 if operation_name==ActionSet.OPERATION_CREATE_PERSISTENT_FACE:
164 result = jinja2.Template(self._Template_CreatePersistentFace).render(**self.d)
165 if operation_name==ActionSet.OPERATION_TOUCH_FACE_FIRST_TIME:
166 result = jinja2.Template(self._Template_TouchFaceFirstTime).render(**self.d)
167 if operation_name==ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
168 result = jinja2.Template(self._Template_TouchCellFirstTime_UpdateSolution).render(**self.d)
169 result += jinja2.Template(self._Template_TouchCellFirstTime_UpdateFaceHelperData).render(**self.d)
170 if operation_name==ActionSet.OPERATION_DESTROY_HANGING_FACE:
171 result = jinja2.Template(self._Template_DestroyHangingFace).render(**self.d)
172 return result
173
174
175 def get_attributes(self):
176 return """
177 toolbox::finiteelements::ElementWiseAssemblyMatrix _cellStiffnessMatrix;
178"""
179
180
181 def get_includes(self):
182 return """
183#include "toolbox/finiteelements/ElementMatrix.h"
184#include "toolbox/finiteelements/StencilFactory.h"
185
186#include "peano4/utils/Loop.h"
187""" + self.additional_includes
188
cardinality is a string (you can thus use symbols as well as long as they will be defined at compile ...
Definition Double.py:6
Default superclass for any data model in Peano which is stored within the grid.
Definition DaStGen2.py:47
Action set (reactions to events)
Definition ActionSet.py:6
get_body_of_operation(self, operation_name)
Return actual C++ code snippets to be inserted into C++ code.
construct_face_helper_data(peano4.datamodel.DaStGen2 cell_data_model)
We cannot access neighbouring cells within Peano.
__init__(self, peano4.datamodel.DaStGen2 cell_data, peano4.datamodel.DaStGen2 face_data, relaxation_coefficient, rhs_expr, unknown_setter="setU", unknown_getter="getU", guard="true")
:Attibutes: