Peano
Loading...
Searching...
No Matches
SolverDeclarations.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3import jinja2
4
5
8 self,
9 flux_implementation,
10 ncp_implementation,
11 eigenvalues_implementation,
12 source_term_implementation,
13 material_parameters_implementation,
14 point_source_implementation,
15 is_linear,
16 computation_precisions,
17 pde_terms_without_state,
18 ):
19 self._flux_implementation = flux_implementation
20 self._ncp_implementation = ncp_implementation
21 self._eigenvalues_implementation = eigenvalues_implementation
22 self._source_term_implementation = source_term_implementation
23 self._material_parameters_implementation = material_parameters_implementation
24 self._point_source_implementation = point_source_implementation
25 self._is_linear = is_linear
26 self._computation_precisions = computation_precisions
27 self._pde_terms_without_state = pde_terms_without_state
28
30 Template_SinglePrecisions = jinja2.Template(
31 """
32 {% if EIGENVALUES_IMPLEMENTATION=="<user-defined>" %}
33 virtual double maxEigenvalue(
34 const {{COMPUTATION_PRECISIONS[0]}}* __restrict__ Q,
35 const tarch::la::Vector<Dimensions, double>& x,
36 const tarch::la::Vector<Dimensions, double>& h,
37 double t,
38 double dt,
39 int normal
40 ) override;
41 {% endif %}
42
43 {% if FLUX_IMPLEMENTATION=="<user-defined>" %}
44 void flux(
45 const {{COMPUTATION_PRECISIONS[0]}}* __restrict__ Q, // Q[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
46 const tarch::la::Vector<Dimensions, double>& x,
47 const tarch::la::Vector<Dimensions, double>& h,
48 double t,
49 double dt,
50 int normal,
51 {{COMPUTATION_PRECISIONS[0]}} * __restrict__ F // F[{{NUMBER_OF_UNKNOWNS}}]
52 ) override;
53 {% endif %}
54
55 {% if NCP_IMPLEMENTATION=="<user-defined>" %}
56 void nonconservativeProduct(
57 const {{COMPUTATION_PRECISIONS[0]}}*__restrict__ Q,
58 const {{COMPUTATION_PRECISIONS[0]}}*__restrict__ deltaQ,
59 const tarch::la::Vector<Dimensions, double>& x,
60 const tarch::la::Vector<Dimensions, double>& h,
61 double t,
62 double dt,
63 int normal,
64 {{COMPUTATION_PRECISIONS[0]}}*__restrict__ BTimesDeltaQ
65 ) override;
66 {% endif %}
67
68 {% if SOURCE_TERM_IMPLEMENTATION=="<user-defined>" %}
69 void algebraicSource(
70 const {{COMPUTATION_PRECISIONS[0]}}* const Q,
71 const tarch::la::Vector<Dimensions, double>& x,
72 const tarch::la::Vector<Dimensions, double>& h,
73 double t,
74 double dt,
75 {{COMPUTATION_PRECISIONS[0]}}* S
76 ) override;
77 {% endif %}
78
79 {% if MATERIAL_PARAM_IMPLEMENTATION=="<user-defined>" %}
80 void multiplyMaterialParameterMatrix(
81 const {{COMPUTATION_PRECISIONS[0]}}* const Q,
82 const tarch::la::Vector<Dimensions, double>& x,
83 const tarch::la::Vector<Dimensions, double>& h,
84 double t,
85 double dt,
86 int normal,
87 {{COMPUTATION_PRECISIONS[0]}}* const rhs
88 ) override;
89 {% endif %}
90
91 {% if POINT_SOURCE_IMPLEMENTATION=="<user-defined>" %}
92 void pointSource(
93 const {{COMPUTATION_PRECISIONS[0]}}* const Q,
94 const double* const x,
95 const double t,
96 const double dt,
97 {{COMPUTATION_PRECISIONS[0]}}* const forceVector,
98 int n
99 ) override;
100 {% endif %}
101
102 {% if POINT_SOURCE_IMPLEMENTATION!="<none>" %}
103 void initPointSourceLocations(
104 double sourceLocation[NumberOfPointSources][Dimensions]
105 ) override;
106 {% endif %}
107""",
108 undefined=jinja2.DebugUndefined,
109 )
110
111 Template_MultiplePrecisions = jinja2.Template(
112 """
113 {% if EIGENVALUES_IMPLEMENTATION=="<user-defined>" %}
114 template <typename T>
115 double maxEigenvalue(
116 const T* __restrict__ Q,
117 const tarch::la::Vector<Dimensions, double>& x,
118 const tarch::la::Vector<Dimensions, double>& h,
119 double t,
120 double dt,
121 int normal
122 );
123 {% endif %}
124
125 {% if FLUX_IMPLEMENTATION=="<user-defined>" %}
126 template <typename T>
127 void flux(
128 const T* __restrict__ Q, // Q[{{NUMBER_OF_UNKNOWNS}}+{{NUMBER_OF_AUXILIARY_VARIABLES}}]
129 const tarch::la::Vector<Dimensions, double>& x,
130 const tarch::la::Vector<Dimensions, double>& h,
131 double t,
132 double dt,
133 int normal,
134 T* __restrict__ F // F[{{NUMBER_OF_UNKNOWNS}}]
135 );
136 {% endif %}
137
138 {% if NCP_IMPLEMENTATION=="<user-defined>" %}
139 template <typename T>
140 void nonconservativeProduct(
141 const T*__restrict__ Q,
142 const T*__restrict__ deltaQ,
143 const tarch::la::Vector<Dimensions, double>& x,
144 const tarch::la::Vector<Dimensions, double>& h,
145 double t,
146 double dt,
147 int normal,
148 T*__restrict__ BTimesDeltaQ
149 );
150
151 {% endif %}
152 {% if SOURCE_TERM_IMPLEMENTATION=="<user-defined>" %}
153 template <typename T>
154 void algebraicSource(
155 const T* const Q,
156 const tarch::la::Vector<Dimensions, double>& x,
157 const tarch::la::Vector<Dimensions, double>& h,
158 double t,
159 double dt,
160 T* S
161 );
162 {% endif %}
163
164 {% if MATERIAL_PARAM_IMPLEMENTATION=="<user-defined>" %}
165 template <typename T>
166 void multiplyMaterialParameterMatrix(
167 const T* const Q,
168 const tarch::la::Vector<Dimensions, double>& x,
169 const tarch::la::Vector<Dimensions, double>& h,
170 double t,
171 double dt,
172 int normal,
173 T* const rhs
174 );
175 {% endif %}
176
177 {% if POINT_SOURCE_IMPLEMENTATION=="<user-defined>" %}
178 template <typename T>
179 void pointSource(
180 const T* const Q,
181 const double* const x,
182 const double t,
183 const double dt,
184 T* const forceVector,
185 int n
186 );
187 {% endif %}
188
189 {% if POINT_SOURCE_IMPLEMENTATION!="<none>" %}
190 void initPointSourceLocations(
191 double sourceLocation[NumberOfPointSources][Dimensions]
192 ) override;
193 {% endif %}
194
195 {% for PRECISION_NUM in range(0,COMPUTATION_PRECISIONS|length) %}
196
197 {% if EIGENVALUES_IMPLEMENTATION=="<user-defined>" %}
198 double maxEigenvalue(
199 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* __restrict__ Q,
200 const tarch::la::Vector<Dimensions, double>& x,
201 const tarch::la::Vector<Dimensions, double>& h,
202 double t,
203 double dt,
204 int normal
205 ) {
206 return maxEigenvalue<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}> (Q, x, h, t, dt, normal);
207 }
208 {% endif %}
209
210 {% if FLUX_IMPLEMENTATION=="<user-defined>" %}
211 void flux(
212 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* __restrict__ Q,
213 const tarch::la::Vector<Dimensions, double>& x,
214 const tarch::la::Vector<Dimensions, double>& h,
215 double t,
216 double dt,
217 int normal,
218 {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* __restrict__ F
219 ) {
220 flux<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}>(Q, x, h, t, dt, normal, F);
221 }
222 {% endif %}
223
224 {% if NCP_IMPLEMENTATION=="<user-defined>" %}
225 void nonconservativeProduct(
226 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}} *__restrict__ Q,
227 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}} *__restrict__ deltaQ,
228 const tarch::la::Vector<Dimensions, double>& x,
229 const tarch::la::Vector<Dimensions, double>& h,
230 double t,
231 double dt,
232 int normal,
233 {{COMPUTATION_PRECISIONS[PRECISION_NUM]}} *__restrict__ BTimesDeltaQ
234 ) override {
235 nonconservativeProduct<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}>(Q, deltaQ, x, h, t, dt, normal, BTimesDeltaQ);
236 }
237 {% endif %}
238
239 {% if SOURCE_TERM_IMPLEMENTATION=="<user-defined>" %}
240 void algebraicSource(
241 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* const Q,
242 const tarch::la::Vector<Dimensions, double>& x,
243 const tarch::la::Vector<Dimensions, double>& h,
244 double t,
245 double dt,
246 {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* S
247 ) override {
248 algebraicSource<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}>(Q, x, h, t, dt, S);
249 }
250 {% endif %}
251
252 {% if MATERIAL_PARAM_IMPLEMENTATION=="<user-defined>" %}
253 void multiplyMaterialParameterMatrix(
254 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* const Q,
255 const tarch::la::Vector<Dimensions, double>& x,
256 const tarch::la::Vector<Dimensions, double>& h,
257 double t,
258 double dt,
259 int normal,
260 {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* const rhs
261 ) override {
262 multiplyMaterialParameterMatrix<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}>(Q, x, h, t, dt, normal, rhs);
263 }
264 {% endif %}
265
266 {% if POINT_SOURCE_IMPLEMENTATION=="<user-defined>" %}
267 void pointSource(
268 const {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* const Q,
269 const double* const x,
270 const double t,
271 const double dt,
272 {{COMPUTATION_PRECISIONS[PRECISION_NUM]}}* const forceVector,
273 int n
274 ) override {
275 pointSource<{{COMPUTATION_PRECISIONS[PRECISION_NUM]}}>(Q, x, t, dt, forceVector, n);
276 }
277 {% endif %}
278
279 {% endfor %}
280""",
281 undefined=jinja2.DebugUndefined,
282 )
283
284 d = {}
285 d["FLUX_IMPLEMENTATION"] = self._flux_implementation
286 d["NCP_IMPLEMENTATION"] = self._ncp_implementation
287 d["EIGENVALUES_IMPLEMENTATION"] = self._eigenvalues_implementation
288 d["SOURCE_TERM_IMPLEMENTATION"] = self._source_term_implementation
289 d["MATERIAL_PARAM_IMPLEMENTATION"] = self._material_parameters_implementation
290 d["POINT_SOURCE_IMPLEMENTATION"] = self._point_source_implementation
291 d["IS_LINEAR"] = self._is_linear
292 d["COMPUTATION_PRECISIONS"] = self._computation_precisions
293 d["STATELESS_PDE_TERMS"] = self._pde_terms_without_state
294
295 if len(self._computation_precisions) > 1:
296 return Template_MultiplePrecisions.render(**d)
297 else:
298 return Template_SinglePrecisions.render(**d)
__init__(self, flux_implementation, ncp_implementation, eigenvalues_implementation, source_term_implementation, material_parameters_implementation, point_source_implementation, is_linear, computation_precisions, pde_terms_without_state)