29template <MInt nDim, MInt nDist,
class SysEqn>
52 const MInt solverId = m_solver->solverId();
53 m_interfaceMethod =
"FILIPPOVA";
54 m_interfaceMethod = Context::getSolverProperty<MString>(
"interfaceMethod", solverId, AT_, &m_interfaceMethod);
56 setInterfaceFunctions();
58 m_adaptationInitMethod =
"INIT_DUPUIS_FILIPPOVA";
59 m_adaptationInitMethod =
61 Context::getSolverProperty<MString>(
"interfaceMethod", solverId, AT_, &m_adaptationInitMethod);
62 setAdaptationFunctions();
69template <MInt nDim, MInt nDist,
class SysEqn>
77template <MInt nDim, MInt nDist,
class SysEqn>
87 }
else if(m_solver->isCompressible()) {
108 stringstream errorMessage;
109 errorMessage <<
" LbInterface::setInterfaceFunctions: Specified interface condition: " << m_interfaceMethod
110 <<
" does not exist. Exiting!";
111 mTerm(1, AT_, errorMessage.str());
121template <MInt nDim, MInt nDist,
class SysEqn>
123 (this->*fProlongation)();
131template <MInt nDim, MInt nDist,
class SysEqn>
133 (this->*fRestriction)();
142template <MInt nDim, MInt nDist,
class SysEqn>
144 MFloat& tmp2 = m_static_prolongation10_tmp2;
145 MFloat(&
b)[2 * nDim] = m_static_prolongation10_b;
146 MFloat(&c)[nDim * nDim] = m_static_prolongation10_c;
147 MFloat& trace = m_static_prolongation10_trace;
149 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
157 for(
MInt id = 0;
id < m_interfaceChildren[level]->size();
id++) {
158 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
159 if(currentId >= m_solver->noInternalCells())
continue;
160 const MInt parentId = m_solver->c_parentId(m_interfaceChildren[level]->
a[
id].m_cellId);
161 if(parentId >= m_solver->noInternalCells())
continue;
165 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
174 std::array<MFloat, nDim> u{};
176 rho += 2.0 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
177 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
178 u[0] += 2.0 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
179 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
180 u[1] += 2.0 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
181 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
182 IF_CONSTEXPR(nDim == 3)
183 u[2] += 2.0 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
184 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
188 rho -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
189 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
190 u[0] -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
191 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
192 u[1] -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
193 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
194 IF_CONSTEXPR(nDim == 3)
195 u[2] -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
196 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
200 IF_CONSTEXPR(nDim == 3) {
201 for(
MInt j = 0; j < 3; j++) {
205 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0]
206 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[1])
207 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[1], j)
208 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
209 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2]
210 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
211 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
212 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
213 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4]
214 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
215 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
216 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
217 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
218 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7])
219 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
220 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)));
224 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[2]
225 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
226 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[2], j)
227 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
228 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3]
229 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
230 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
231 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
232 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
233 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4])
234 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
235 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
236 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
237 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
238 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
239 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)));
243 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[4]
244 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
245 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[4], j)
246 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
247 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5]
248 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
249 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
250 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
251 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
252 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2])
253 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
254 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
255 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
256 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
257 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
258 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)));
261 for(
MInt j = 0; j < 3; j++) {
265 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0]
266 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[1])
267 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[1], j)
268 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
269 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2]
270 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
271 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
272 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
273 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4]
274 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
275 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
276 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
277 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
278 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7])
279 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
280 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6],
285 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[2]
286 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
287 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[2], j)
288 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
289 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3]
290 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
291 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
292 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
293 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
294 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4])
295 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
296 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
297 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
298 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
299 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
300 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5],
305 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[4]
306 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
307 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[4], j)
308 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
309 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5]
310 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
311 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
312 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
313 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
314 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2])
315 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
316 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
317 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
318 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
319 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
320 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3],
323 trace = c[0] + c[4] + c[8];
326 cout <<
"Strain rate tensor not implemented for 2D yet" << endl;
339 for(
MInt d = 0; d < nDim; d++) {
340 tmp2 += (u[d] * u[d]);
346 std::array<MFloat, nDist> eqDist;
347 eqDist = m_solver->getEqDists(rho, tmp2, u.data());
352 if(m_solver->a_hasNeighbor(currentId, Ld::oppositeDist(
dist)) == 0) {
357 m_solver->a_oldDistribution(currentId,
dist) = eqDist[
dist] + tp * trace / omega_F;
359 for(
MInt k = 0; k < nDim; k++) {
360 for(
MInt l = 0; l < nDim; l++) {
361 m_solver->a_oldDistribution(currentId,
dist) -=
362 tp * F1BCSsq * (Ld::idFld(
dist, k) - 1) * (Ld::idFld(
dist, l) - 1) * c[l + nDim * k] / omega_F;
376 for(
MInt id = 0;
id < m_interfaceChildren[level]->size();
id++) {
377 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
378 if(currentId >= m_solver->noInternalCells())
continue;
379 const MInt parentId = m_solver->c_parentId(m_interfaceChildren[level]->
a[
id].m_cellId);
380 if(parentId >= m_solver->noInternalCells())
continue;
385 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
392 std::array<MFloat, nDim> u{};
395 rho += 1.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
396 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
397 u[0] += 1.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
398 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
399 u[1] += 1.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
400 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
401 IF_CONSTEXPR(nDim == 3)
402 u[2] += 1.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
403 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
407 rho -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
408 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
409 u[0] -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
410 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
411 u[1] -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
412 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
413 IF_CONSTEXPR(nDim == 3)
414 u[2] -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
415 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
419 IF_CONSTEXPR(nDim == 3) {
420 for(
MInt j = 0; j < 3; j++) {
424 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0]
425 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[1])
426 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[1], j)
427 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
428 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2]
429 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
430 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
431 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
432 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4]
433 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
434 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
435 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
436 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
437 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7])
438 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
439 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6],
444 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[2]
445 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
446 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[2], j)
447 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
448 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3]
449 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
450 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
451 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
452 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
453 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4])
454 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
455 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4], j))
456 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
457 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
458 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
459 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5],
464 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[4]
465 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
466 * (m_solver->a_variable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[4], j)
467 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
468 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5]
469 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
470 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
471 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1], j))
472 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
473 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2])
474 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
475 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2], j))
476 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
477 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
478 * (m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
479 - m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3],
483 for(
MInt j = 0; j < 3; j++) {
487 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0]
488 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[1])
489 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[1], j)
490 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
491 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2]
492 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
493 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
494 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2],
496 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4]
497 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
498 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
499 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4],
501 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
502 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7])
503 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
504 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6],
509 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[2]
510 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
511 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[2], j)
512 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
513 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3]
514 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
515 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3], j)
516 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1],
518 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
519 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[4])
520 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
521 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[4],
523 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
524 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5])
525 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
526 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5],
531 * ((m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[4]
532 + m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[0])
533 * (m_solver->a_oldVariable(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[4], j)
534 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[0], j))
535 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[5]
536 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[1])
537 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[5], j)
538 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[1],
540 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[6]
541 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[2])
542 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[6], j)
543 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[2],
545 + (m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[7]
546 + m_interfaceChildren[level]->
a[
id].m_interpolationCoefficients[3])
547 * (m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[7], j)
548 - m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[3],
551 trace = c[0] + c[4] + c[8];
554 cout <<
"Strain rate tensor not implemented for 2D yet" << endl;
561 for(
MInt d = 0; d < nDim; d++) {
562 tmp2 += (u[d] * u[d]);
568 std::array<MFloat, nDist> eqDist;
569 eqDist = m_solver->getEqDists(rho, tmp2, u.data());
574 if(m_solver->a_hasNeighbor(currentId, Ld::oppositeDist(
dist)) == 0) {
579 m_solver->a_oldDistribution(currentId,
dist) = eqDist[
dist] + tp * trace / omega_F;
581 for(
MInt k = 0; k < nDim; k++) {
582 for(
MInt l = 0; l < nDim; l++) {
583 m_solver->a_oldDistribution(currentId,
dist) -=
584 tp * F1BCSsq * (Ld::idFld(
dist, k) - 1) * (Ld::idFld(
dist, l) - 1) * c[l + nDim * k] / omega_F;
601template <MInt nDim, MInt nDist,
class SysEqn>
603 MFloat& tmp2 = m_static_restriction10_tmp2;
604 MFloat(&
b)[2 * nDim] = m_static_restriction10_b;
605 MFloat(&c)[nDim * nDim] = m_static_restriction10_c;
606 MFloat& trace = m_static_restriction10_trace;
608 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
616 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
617 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
618 if(currentId >= m_solver->noInternalCells())
continue;
623 2.0 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
626 std::array<MFloat, nDim> u{};
633 rho += 2.0 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->RHO);
634 u[0] += 2.0 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->U);
635 u[1] += 2.0 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->V);
636 IF_CONSTEXPR(nDim == 3)
637 u[2] += 2.0 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->W);
640 rho -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->RHO);
641 u[0] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->U);
642 u[1] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->V);
643 IF_CONSTEXPR(nDim == 3)
644 u[2] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->W);
648 IF_CONSTEXPR(nDim == 3) {
649 for(
MInt j = 0; j < 3; j++) {
651 c[j] = 2.0 * F1B4 * rho * 2.0
652 * ((m_solver->a_variable(m_solver->c_childId(currentId, 1), j)
653 - m_solver->a_variable(m_solver->c_childId(currentId, 0), j))
654 + (m_solver->a_variable(m_solver->c_childId(currentId, 3), j)
655 - m_solver->a_variable(m_solver->c_childId(currentId, 2), j))
656 + (m_solver->a_variable(m_solver->c_childId(currentId, 5), j)
657 - m_solver->a_variable(m_solver->c_childId(currentId, 4), j))
658 + (m_solver->a_variable(m_solver->c_childId(currentId, 7), j)
659 - m_solver->a_variable(m_solver->c_childId(currentId, 6), j)));
661 c[j + 3] = 2.0 * F1B4 * rho * 2.0
662 * ((m_solver->a_variable(m_solver->c_childId(currentId, 2), j)
663 - m_solver->a_variable(m_solver->c_childId(currentId, 0), j))
664 + (m_solver->a_variable(m_solver->c_childId(currentId, 3), j)
665 - m_solver->a_variable(m_solver->c_childId(currentId, 1), j))
666 + (m_solver->a_variable(m_solver->c_childId(currentId, 6), j)
667 - m_solver->a_variable(m_solver->c_childId(currentId, 4), j))
668 + (m_solver->a_variable(m_solver->c_childId(currentId, 7), j)
669 - m_solver->a_variable(m_solver->c_childId(currentId, 5), j)));
671 c[j + 6] = 2.0 * F1B4 * rho * 2.0
672 * ((m_solver->a_variable(m_solver->c_childId(currentId, 4), j)
673 - m_solver->a_variable(m_solver->c_childId(currentId, 0), j))
674 + (m_solver->a_variable(m_solver->c_childId(currentId, 5), j)
675 - m_solver->a_variable(m_solver->c_childId(currentId, 1), j))
676 + (m_solver->a_variable(m_solver->c_childId(currentId, 6), j)
677 - m_solver->a_variable(m_solver->c_childId(currentId, 2), j))
678 + (m_solver->a_variable(m_solver->c_childId(currentId, 7), j)
679 - m_solver->a_variable(m_solver->c_childId(currentId, 3), j)));
682 for(
MInt j = 0; j < 3; j++) {
684 c[j] -= 1.0 * F1B4 * rho * 2.0
685 * ((m_solver->a_oldVariable(m_solver->c_childId(currentId, 1), j)
686 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 0), j))
687 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 3), j)
688 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 2), j))
689 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 5), j)
690 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 4), j))
691 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 7), j)
692 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 6), j)));
694 c[j + 3] -= 1.0 * F1B4 * rho * 2.0
695 * ((m_solver->a_oldVariable(m_solver->c_childId(currentId, 2), j)
696 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 0), j))
697 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 3), j)
698 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 1), j))
699 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 6), j)
700 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 4), j))
701 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 7), j)
702 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 5), j)));
704 c[j + 6] -= 1.0 * F1B4 * rho * 2.0
705 * ((m_solver->a_oldVariable(m_solver->c_childId(currentId, 4), j)
706 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 0), j))
707 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 5), j)
708 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 1), j))
709 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 6), j)
710 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 2), j))
711 + (m_solver->a_oldVariable(m_solver->c_childId(currentId, 7), j)
712 - m_solver->a_oldVariable(m_solver->c_childId(currentId, 3), j)));
714 trace = c[0] + c[4] + c[8];
717 cout <<
"Strain rate tensor not implemented for 2D yet" << endl;
724 m_solver->a_variable(currentId, PV->RHO) = rho;
725 m_solver->a_variable(currentId, PV->U) = u[0];
726 m_solver->a_variable(currentId, PV->V) = u[1];
727 IF_CONSTEXPR(nDim == 3) m_solver->a_variable(currentId, PV->W) = u[2];
730 for(
MInt d = 0; d < nDim; d++) {
731 tmp2 += (u[d] * u[d]);
736 std::array<MFloat, nDist> eqDist;
737 eqDist = m_solver->getEqDists(rho, tmp2, u.data());
742 if(!m_solver->a_hasNeighbor(currentId, Ld::oppositeDist(
dist))
743 || (!m_solver->a_isInterfaceParent(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))
744 && !m_solver->c_isLeafCell(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist))))) {
749 m_solver->a_oldDistribution(currentId,
dist) = eqDist[
dist] + tp * trace / omega_C;
751 for(
MInt k = 0; k < nDim; k++) {
752 for(
MInt l = 0; l < nDim; l++) {
753 m_solver->a_oldDistribution(currentId,
dist) -=
754 tp * F1BCSsq * (Ld::idFld(
dist, k) - 1) * (Ld::idFld(
dist, l) - 1) * c[l + nDim * k] / omega_C;
770template <MInt nDim, MInt nDist,
class SysEqn>
771template <MBool compressible>
774 const MInt noInternalCells = m_solver->noInternalCells();
777 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
791 maia::parallelFor<true>(0, m_interfaceChildren[level]->size(), [=](
MInt id) {
792 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
794 if(currentId >= noInternalCells)
return;
796 if(currentId >= m_solver->noInternalCells())
return;
802 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
805 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
810 std::array<MFloat, nDim> u{};
813 rho += 2.0 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
814 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
815 for(
MInt d = 0; d < nDim; d++) {
816 u[d] += 2.0 * m_interfaceChildren[level]->a[id].m_interpolationCoefficients[m]
817 * m_solver->a_variable(m_interfaceChildren[level]->a[id].m_interpolationNeighbors[m], d);
822 rho -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
823 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
824 for(
MInt d = 0; d < nDim; d++) {
825 u[d] -= m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
826 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], d);
831 std::array<MFloat, nDist> eqDist;
832 eqDist = m_solver->getEqDists(rho, u.data());
838 MInt oppositeDist = m_solver->m_oppositeDist[
dist];
840 MInt oppositeDist = Ld::oppositeDist(
dist);
842 if(m_solver->a_hasNeighbor(currentId,
dist) == 0) {
846 tmpDist1 += m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
847 * m_solver->a_oldDistribution(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
851 m_solver->a_oldDistribution(currentId, oppositeDist) =
852 (tmpDist1 - eqDist[oppositeDist]) * (omega_C / omega_F) * F1B2 + eqDist[oppositeDist];
861 maia::parallelFor<true>(0, m_interfaceChildren[level]->size(), [=](
MInt id) {
862 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
864 if(currentId >= noInternalCells)
return;
866 if(currentId >= m_solver->noInternalCells())
return;
872 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
875 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
880 std::array<MFloat, nDim> u{};
883 rho += 1.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
884 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
885 for(
MInt d = 0; d < nDim; d++) {
886 u[d] += 1.5 * m_interfaceChildren[level]->a[id].m_interpolationCoefficients[m]
887 * m_solver->a_variable(m_interfaceChildren[level]->a[id].m_interpolationNeighbors[m], d);
892 rho -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
893 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
894 for(
MInt d = 0; d < nDim; d++) {
895 u[d] -= 0.5 * m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
896 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], d);
901 std::array<MFloat, nDist> eqDist;
902 eqDist = m_solver->getEqDists(rho, u.data());
903 std::array<MFloat, nDist> forcing{};
904 getCellForcing(forcing, currentId);
910 MInt oppositeDist = m_solver->m_oppositeDist[
dist];
912 MInt oppositeDist = Ld::oppositeDist(
dist);
914 if(m_solver->a_hasNeighbor(currentId,
dist) == 0) {
921 const MFloat tmpDist = m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
922 * m_solver->a_oldDistribution(
923 m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], oppositeDist);
924 if(m_solver->a_hasNeighbor(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[m],
dist)) {
928 const MInt neighborId =
929 m_solver->c_neighborId(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
dist);
930 tmpDist1 += m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
931 * m_solver->a_distribution(neighborId, oppositeDist);
936 tmpDist1 += m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
937 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level) * forcing[oppositeDist];
948 m_solver->a_oldDistribution(currentId, oppositeDist) =
949 (0.5 * (tmpDist1 + tmpDist2) - eqDist[oppositeDist]) * (omega_C / omega_F) * F1B2
950 + eqDist[oppositeDist];
959template <MInt nDim, MInt nDist,
class SysEqn>
961 prolongationDupuis_<false>();
964template <MInt nDim, MInt nDist,
class SysEqn>
966 prolongationDupuis_<true>();
977template <MInt nDim, MInt nDist,
class SysEqn>
979 MFloat* ptr_m_interpolationCoefficients;
980 const MFloat factor = (m_solver->m_innerEnergy) ? ((nDim == 2) ? 3.0 : 18.0 / 5.0) : 6.0;
982 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
996 for(
MInt id = 0;
id < m_interfaceChildren[level]->size();
id++) {
997 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
998 if(currentId >= m_solver->noInternalCells())
continue;
1000 ptr_m_interpolationCoefficients = m_interfaceChildren[level]->a[
id].m_interpolationCoefficients;
1005 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1008 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1009 const MFloat omegaT_F = 2.0
1011 + factor * m_solver->a_kappa(currentId)
1012 *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1016 + factor * m_solver->a_kappa(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1021 std::array<MFloat, nDim> u{};
1025 rho += 2.0 * ptr_m_interpolationCoefficients[m]
1026 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
1027 u[0] += 2.0 * ptr_m_interpolationCoefficients[m]
1028 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
1029 u[1] += 2.0 * ptr_m_interpolationCoefficients[m]
1030 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
1031 IF_CONSTEXPR(nDim == 3)
1032 u[2] += 2.0 * ptr_m_interpolationCoefficients[m]
1033 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
1034 T += 2.0 * ptr_m_interpolationCoefficients[m]
1035 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->T);
1036 rho -= ptr_m_interpolationCoefficients[m]
1037 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
1038 u[0] -= ptr_m_interpolationCoefficients[m]
1039 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
1040 u[1] -= ptr_m_interpolationCoefficients[m]
1041 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
1042 IF_CONSTEXPR(nDim == 3)
1043 u[2] -= ptr_m_interpolationCoefficients[m]
1044 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
1045 T -= ptr_m_interpolationCoefficients[m]
1046 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->T);
1052 IF_CONSTEXPR(nDim == 3) u[2] /= rho;
1054 std::array<MFloat, nDist> eqDist{};
1055 eqDist = m_solver->getEqDists(rho, u.data());
1056 std::array<MFloat, nDist> eqDistThermal{};
1057 eqDistThermal = m_solver->getEqDistsThermal(T, rho, u.data());
1062 if(m_solver->a_hasNeighbor(currentId,
dist) == 0) {
1067 tmpDist1 += ptr_m_interpolationCoefficients[m]
1068 * m_solver->a_oldDistribution(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
1069 Ld::oppositeDist(
dist));
1070 tmpDist1T += ptr_m_interpolationCoefficients[m]
1071 * m_solver->a_oldDistributionThermal(
1072 m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], Ld::oppositeDist(
dist));
1075 m_solver->a_oldDistribution(currentId, Ld::oppositeDist(
dist)) =
1076 (tmpDist1 - eqDist[Ld::oppositeDist(
dist)]) * (omega_C / omega_F) * F1B2
1077 + eqDist[Ld::oppositeDist(
dist)];
1078 m_solver->a_oldDistributionThermal(currentId, Ld::oppositeDist(
dist)) =
1079 (tmpDist1T - eqDistThermal[Ld::oppositeDist(
dist)]) * (omegaT_C / omegaT_F) * F1B2
1080 + eqDistThermal[Ld::oppositeDist(
dist)];
1089 for(
MInt id = 0;
id < m_interfaceChildren[level]->size();
id++) {
1090 const MInt currentId = m_interfaceChildren[level]->a[
id].m_cellId;
1092 if(currentId >= m_solver->noInternalCells())
continue;
1094 ptr_m_interpolationCoefficients = m_interfaceChildren[level]->a[
id].m_interpolationCoefficients;
1099 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1102 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1103 const MFloat omegaT_F = 2.0
1105 + 6.0 * m_solver->a_kappa(currentId)
1106 *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1110 + 6.0 * m_solver->a_kappa(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1115 std::array<MFloat, nDim> u{};
1119 rho += 1.5 * ptr_m_interpolationCoefficients[m]
1120 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
1121 u[0] += 1.5 * ptr_m_interpolationCoefficients[m]
1122 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
1123 u[1] += 1.5 * ptr_m_interpolationCoefficients[m]
1124 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
1125 IF_CONSTEXPR(nDim == 3)
1126 u[2] += 1.5 * ptr_m_interpolationCoefficients[m]
1127 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
1128 T += 1.5 * ptr_m_interpolationCoefficients[m]
1129 * m_solver->a_variable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->T);
1130 rho -= 0.5 * ptr_m_interpolationCoefficients[m]
1131 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->RHO);
1132 u[0] -= 0.5 * ptr_m_interpolationCoefficients[m]
1133 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->U);
1134 u[1] -= 0.5 * ptr_m_interpolationCoefficients[m]
1135 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->V);
1136 IF_CONSTEXPR(nDim == 3)
1137 u[2] -= 0.5 * ptr_m_interpolationCoefficients[m]
1138 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->W);
1139 T -= 0.5 * ptr_m_interpolationCoefficients[m]
1140 * m_solver->a_oldVariable(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], PV->T);
1145 IF_CONSTEXPR(nDim == 3) u[2] /= rho;
1147 std::array<MFloat, nDist> eqDist{};
1148 eqDist = m_solver->getEqDists(rho, u.data());
1149 std::array<MFloat, nDist> eqDistThermal{};
1150 eqDistThermal = m_solver->getEqDistsThermal(T, rho, u.data());
1152 std::array<MFloat, nDist> forcing{};
1153 getCellForcing(forcing, currentId);
1158 if(m_solver->a_hasNeighbor(currentId,
dist) == 0) {
1167 if(m_solver->a_hasNeighbor(m_interfaceChildren[level]->a[
id].m_interpolationNeighbors[m],
dist)) {
1168 const MInt neighborId =
1169 m_solver->c_neighborId(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
dist);
1175 ptr_m_interpolationCoefficients[m] * m_solver->a_distribution(neighborId, Ld::oppositeDist(
dist));
1177 ptr_m_interpolationCoefficients[m]
1178 * m_solver->a_oldDistribution(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
1179 Ld::oppositeDist(
dist));
1180 tmpDist1T += ptr_m_interpolationCoefficients[m]
1181 * m_solver->a_distributionThermal(neighborId, Ld::oppositeDist(
dist));
1183 ptr_m_interpolationCoefficients[m]
1184 * m_solver->a_oldDistributionThermal(
1185 m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], Ld::oppositeDist(
dist));
1189 tmpDist1 += m_interfaceChildren[level]->a[
id].m_interpolationCoefficients[m]
1190 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level)
1191 * forcing[Ld::oppositeDist(
dist)];
1198 ptr_m_interpolationCoefficients[m]
1199 * m_solver->a_oldDistribution(m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m],
1200 Ld::oppositeDist(
dist));
1202 ptr_m_interpolationCoefficients[m]
1203 * m_solver->a_oldDistributionThermal(
1204 m_interfaceChildren[level]->
a[
id].m_interpolationNeighbors[m], Ld::oppositeDist(
dist));
1208 tmpDist1 = tmpDist2;
1209 tmpDist1T = tmpDist2T;
1213 m_solver->a_oldDistribution(currentId, Ld::oppositeDist(
dist)) =
1214 (0.5 * (tmpDist1 + tmpDist2) - eqDist[Ld::oppositeDist(
dist)]) * (omega_C / omega_F) * F1B2
1215 + eqDist[Ld::oppositeDist(
dist)];
1216 m_solver->a_oldDistributionThermal(currentId, Ld::oppositeDist(
dist)) =
1217 (0.5 * (tmpDist1T + tmpDist2T) - eqDistThermal[Ld::oppositeDist(
dist)]) * (omegaT_C / omegaT_F) * F1B2
1218 + eqDistThermal[Ld::oppositeDist(
dist)];
1233template <MInt nDim, MInt nDist,
class SysEqn>
1234template <MBool compressible>
1238#ifdef WAR_NVHPC_PSTL
1239 const MInt noInternalCells = m_solver->noInternalCells();
1242 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1246 const MFloat nu_F = m_solver->m_Ma * LBCS / m_solver->m_Re * m_solver->m_referenceLength
1247 *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1);
1248 const MFloat omega_F = 2.0 / (1.0 + 6.0 * nu_F);
1249 const MFloat nu_C = m_solver->m_Ma * LBCS / m_solver->m_Re * m_solver->m_referenceLength
1250 *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level);
1251 const MFloat omega_C = 2.0 / (1.0 + 6.0 * nu_C);
1258 maia::parallelFor<true>(0, m_interfaceParents[level]->size(), [=](
MInt id) {
1259 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1260#ifdef WAR_NVHPC_PSTL
1261 if(currentId >= noInternalCells)
return;
1263 if(currentId >= m_solver->noInternalCells())
return;
1267 std::array<MFloat, nDim> u{};
1272 const MInt childCellId = m_solver->c_childId(currentId, m);
1274 * (2.0 * m_solver->a_variable(childCellId, PV->RHO) - m_solver->a_oldVariable(childCellId, PV->RHO));
1275 for(
MInt n = 0; n < nDim; n++) {
1277 FFPOW2(nDim) * (2.0 * m_solver->a_variable(childCellId, n) - m_solver->a_oldVariable(childCellId, n));
1281 std::array<MFloat, nDist> eqDist;
1282 eqDist = m_solver->getEqDists(rho, u.data());
1286#ifdef WAR_NVHPC_PSTL
1287 MInt oppositeDist = m_solver->m_oppositeDist[
dist];
1289 MInt oppositeDist = Ld::oppositeDist(
dist);
1291 if(!m_solver->a_isInterfaceParent(m_solver->c_neighborId(currentId, oppositeDist))
1292 && !m_solver->c_isLeafCell(m_solver->c_neighborId(currentId, oppositeDist))) {
1296 tmpDist +=
FFPOW2(nDim) * m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1300 m_solver->a_oldDistribution(currentId,
dist) =
1301 (tmpDist - eqDist[
dist]) * (omega_F / omega_C) * 2.0 + eqDist[
dist];
1309template <MInt nDim, MInt nDist,
class SysEqn>
1311 restrictionDupuis_<false>();
1314template <MInt nDim, MInt nDist,
class SysEqn>
1316 restrictionDupuis_<true>();
1327template <MInt nDim, MInt nDist,
class SysEqn>
1329 const MFloat factor = (m_solver->m_innerEnergy) ? ((nDim == 2) ? 3.0 : 18.0 / 5.0) : 6.0;
1330 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1338 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1339 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1340 if(currentId >= m_solver->noInternalCells())
continue;
1344 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1346 2.0 / (1.0 + 6.0 * m_solver->a_nu(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1347 const MFloat omegaT_F = 2.0
1349 + factor * m_solver->a_kappa(currentId)
1350 *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1));
1354 + factor * m_solver->a_kappa(currentId) *
FFPOW2(m_solver->maxLevel() - m_solver->minLevel() - level));
1357 std::array<MFloat, nDim> u{};
1363 rho += F2 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->RHO);
1364 u[0] += F2 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->U);
1365 u[1] += F2 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->V);
1366 IF_CONSTEXPR(nDim == 3)
1367 u[2] += F2 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->W);
1368 T += F2 *
FFPOW2(nDim) * m_solver->a_variable(m_solver->c_childId(currentId, m), PV->T);
1369 rho -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->RHO);
1370 u[0] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->U);
1371 u[1] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->V);
1372 IF_CONSTEXPR(nDim == 3)
1373 u[2] -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->W);
1374 T -=
FFPOW2(nDim) * m_solver->a_oldVariable(m_solver->c_childId(currentId, m), PV->T);
1377 for(
MInt d = 0; d < nDim; d++) {
1381 std::array<MFloat, nDist> eqDist{};
1382 eqDist = m_solver->getEqDists(rho, u.data());
1383 std::array<MFloat, nDist> eqDistThermal{};
1384 eqDistThermal = m_solver->getEqDistsThermal(T, rho, u.data());
1388 if(!m_solver->a_isInterfaceParent(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))
1389 && !m_solver->c_isLeafCell(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))) {
1394 tmpDist +=
FFPOW2(nDim) * m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1395 tmpDistT +=
FFPOW2(nDim) * m_solver->a_oldDistributionThermal(m_solver->c_childId(currentId, m),
dist);
1399 m_solver->a_oldDistribution(currentId,
dist) =
1400 (tmpDist - eqDist[
dist]) * (omega_F / omega_C) * 2.0 + eqDist[
dist];
1401 m_solver->a_oldDistributionThermal(currentId,
dist) =
1402 (tmpDistT - eqDistThermal[
dist]) * (omegaT_F / omegaT_C) * 2.0 + eqDistThermal[
dist];
1415template <MInt nDim, MInt nDist,
class SysEqn>
1417 std::array<MFloat, nDist> forcing{};
1418 getCellForcing(forcing);
1420 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1424 if((
globalTimeStep) %
IPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) == 0) {
1428 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1429 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1430 if(currentId >= m_solver->noInternalCells())
continue;
1433 if(m_cellDependentForcing) getCellForcing(forcing, m_solver->c_childId(currentId, m));
1436 m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist) -=
1437 FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1440 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) =
1441 m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1444 for(
MInt var = 0; var < (nDim + 1); var++) {
1445 m_solver->a_variable(m_solver->c_childId(currentId, m), var) = m_solver->a_variable(currentId, var);
1454 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1455 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1456 if(currentId >= m_solver->noInternalCells())
continue;
1461 if(m_cellDependentForcing) getCellForcing(forcing, m_solver->c_childId(currentId, m));
1463 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) =
1464 m_solver->a_distribution(currentId,
dist);
1467 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) +=
1468 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level) * forcing[
dist];
1470 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) -=
1471 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1475 for(
MInt var = 0; var < (nDim + 1); var++) {
1476 m_solver->a_variable(m_solver->c_childId(currentId, m), var) = m_solver->a_variable(currentId, var);
1493template <MInt nDim, MInt nDist,
class SysEqn>
1495 std::array<MFloat, nDist> forcing{};
1496 getCellForcing(forcing);
1498 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1502 if((
globalTimeStep) %
IPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) == 0) {
1506 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1507 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1508 if(currentId >= m_solver->noInternalCells())
continue;
1512 if(m_cellDependentForcing) getCellForcing(forcing, m_solver->c_childId(currentId, m));
1515 m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist) -=
1516 FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1519 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) =
1520 m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1521 m_solver->a_distributionThermal(m_solver->c_childId(currentId, m),
dist) =
1522 m_solver->a_oldDistributionThermal(m_solver->c_childId(currentId, m),
dist);
1525 for(
MInt var = 0; var < (nDim + 2); var++) {
1526 m_solver->a_variable(m_solver->c_childId(currentId, m), var) = m_solver->a_variable(currentId, var);
1535 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1536 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1537 if(currentId >= m_solver->noInternalCells())
continue;
1542 if(m_cellDependentForcing) getCellForcing(forcing, m_solver->c_childId(currentId, m));
1544 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) =
1545 m_solver->a_distribution(currentId,
dist);
1546 m_solver->a_distributionThermal(m_solver->c_childId(currentId, m),
dist) =
1547 m_solver->a_distributionThermal(currentId,
dist);
1550 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) +=
1551 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level) * forcing[
dist];
1553 m_solver->a_distribution(m_solver->c_childId(currentId, m),
dist) -=
1554 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1558 for(
MInt var = 0; var < (nDim + 2); var++) {
1559 m_solver->a_variable(m_solver->c_childId(currentId, m), var) = m_solver->a_variable(currentId, var);
1575template <MInt nDim, MInt nDist,
class SysEqn>
1577 std::array<MFloat, nDist> forcing{};
1578 getCellForcing(forcing);
1580 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1585 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1586 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1587 if(currentId >= m_solver->noInternalCells())
continue;
1588 if(m_cellDependentForcing) getCellForcing(forcing, currentId);
1591 if(!m_solver->a_isInterfaceParent(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))
1592 && !m_solver->c_isLeafCell(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))) {
1593 m_solver->a_oldDistribution(currentId,
dist) = F0;
1596 m_solver->a_oldDistribution(currentId,
dist) +=
1597 FFPOW2(nDim) * m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1601 m_solver->a_oldDistribution(currentId,
dist) +=
1602 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1604 m_solver->a_oldDistribution(currentId,
dist) -=
1605 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level) * forcing[
dist];
1621template <MInt nDim, MInt nDist,
class SysEqn>
1623 std::array<MFloat, nDist> forcing{};
1624 getCellForcing(forcing);
1626 for(
MInt level = 0; level < (m_solver->maxLevel() - m_solver->minLevel());
1631 for(
MInt id = 0;
id < m_interfaceParents[level]->size();
id++) {
1632 const MInt currentId = m_interfaceParents[level]->a[
id].m_cellId;
1633 if(currentId >= m_solver->noInternalCells())
continue;
1634 if(m_cellDependentForcing) getCellForcing(forcing, currentId);
1637 if(!m_solver->a_isInterfaceParent(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))
1638 && !m_solver->c_isLeafCell(m_solver->c_neighborId(currentId, Ld::oppositeDist(
dist)))) {
1639 m_solver->a_oldDistribution(currentId,
dist) = F0;
1640 m_solver->a_oldDistributionThermal(currentId,
dist) = F0;
1643 m_solver->a_oldDistribution(currentId,
dist) +=
1644 FFPOW2(nDim) * m_solver->a_oldDistribution(m_solver->c_childId(currentId, m),
dist);
1645 m_solver->a_oldDistributionThermal(currentId,
dist) +=
1646 FFPOW2(nDim) * m_solver->a_oldDistributionThermal(m_solver->c_childId(currentId, m),
dist);
1650 m_solver->a_oldDistribution(currentId,
dist) +=
1651 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level - 1) * forcing[
dist];
1653 m_solver->a_oldDistribution(currentId,
dist) -=
1654 F1B2 *
FPOW2(m_solver->maxLevel() - m_solver->minLevel() - level) * forcing[
dist];
1669template <MInt nDim, MInt nDist,
class SysEqn>
1686 stringstream errorMessage;
1687 errorMessage <<
" LbInterface::setAdaptationFunctions: Specified interface condition: " << m_adaptationInitMethod
1688 <<
" does not exist. Exiting!";
1689 mTerm(1, AT_, errorMessage.str());
1694template <MInt nDim, MInt nDist,
class SysEqn>
1696 (this->*fRefineCell)(parentId, childIds);
1699template <MInt nDim, MInt nDist,
class SysEqn>
1701 (this->*fRemoveChildren)(parentId);
1713template <MInt nDim, MInt nDist,
class SysEqn>
1718 if(!m_solver->a_isHalo(parentId)) {
1723 MInt parentNeighbors[IPOW3[nDim] - 1];
1724 for(
MInt n = 0; n < IPOW3[nDim] - 1; n++) {
1725 parentNeighbors[n] = m_solver->c_neighborId(parentId, n);
1728 const MInt parentLevel = m_solver->c_level(parentId);
1729 const MInt dParentLevel = m_solver->maxLevel() - parentLevel;
1730 const MFloat omega_F = 2.0 / (1.0 + 6.0 * m_solver->a_nu(parentId) *
FFPOW2(dParentLevel - 1));
1731 const MFloat omega_C = 2.0 / (1.0 + 6.0 * m_solver->a_nu(parentId) *
FFPOW2(dParentLevel));
1732 std::array<MFloat, nDist> forcing{};
1733 getCellForcing(forcing);
1738 for(
MInt child = 0; child <
IPOW2(nDim); child++) {
1739 if(childIds[child] < 0)
continue;
1740 const MInt childId = childIds[child];
1742 m_solver->a_nu(childId) = m_solver->a_nu(parentId);
1746 for(
MInt dim = 0; dim < nDim; dim++) {
1747 if(m_solver->a_coordinate(childId, dim) < m_solver->a_coordinate(parentId, dim)) {
1750 position +=
IPOW2(dim);
1756 MInt interpolationNeighbors[
IPOW2(nDim)];
1758 const MInt dir = Ld::intNghbrArray(position, k);
1759 if(dir < IPOW3[nDim] - 1) {
1760 interpolationNeighbors[k] = parentNeighbors[dir];
1762 interpolationNeighbors[k] = parentId;
1768 interpolationCoefficients[k] = Ld::linearInterpolationCoefficients(position, k);
1772 std::array<MFloat, nDim> u{};
1774 std::array<MFloat, nDim> uOld{};
1778 const MInt interpNeighbor = interpolationNeighbors[m];
1779 const MFloat interpCoeff = interpolationCoefficients[m];
1782 rho += interpCoeff * m_solver->a_variable(interpNeighbor, PV->RHO);
1783 for(
MInt n = 0; n < nDim; n++) {
1784 u[n] += interpCoeff * m_solver->a_variable(interpNeighbor, PV->VV[n]);
1788 rhoOld += interpCoeff * m_solver->a_variable(interpNeighbor, PV->RHO);
1789 for(
MInt n = 0; n < nDim; n++) {
1790 uOld[n] += interpCoeff * m_solver->a_variable(interpNeighbor, PV->VV[n]);
1796 const MFloat rho_tp1 = 2 * rho - rhoOld;
1797 std::array<MFloat, nDim> u_tp1{};
1798 for(
MInt d = 0; d < nDim; d++) {
1799 u_tp1[d] = 2 * u[d] - uOld[d];
1804 MFloat rho_tp12 = 1.5 * rho - 0.5 * rhoOld;
1805 std::array<MFloat, nDim> u_tp12{};
1806 for(
MInt d = 0; d < nDim; d++) {
1807 u_tp12[d] = 1.5 * u[d] - 0.5 * uOld[d];
1811 m_solver->a_variable(childId, PV->RHO) = rho_tp12;
1812 for(
MInt n = 0; n < nDim; n++) {
1813 m_solver->a_variable(childId, PV->VV[n]) = u_tp12[n];
1815 m_solver->a_oldVariable(childId, PV->RHO) = rho;
1816 for(
MInt n = 0; n < nDim; n++) {
1817 m_solver->a_oldVariable(childId, PV->VV[n]) = u[n];
1821 std::array<MFloat, nDist> eqDist_tp1{};
1822 eqDist_tp1 = m_solver->getEqDists(rho_tp1, u_tp1.data());
1828 tmpDist += interpolationCoefficients[m] * m_solver->a_oldDistribution(interpolationNeighbors[m],
dist);
1832 m_solver->a_oldDistribution(childId,
dist) =
1833 (tmpDist - eqDist_tp1[
dist]) * (omega_C / omega_F) * F1B2 + eqDist_tp1[
dist];
1836 m_solver->a_distribution(childId,
dist) = m_solver->a_oldDistribution(childId,
dist);
1841 for(
MInt child = 0; child <
IPOW2(nDim); child++) {
1842 if(childIds[child] < 0)
continue;
1843 const MInt childId = childIds[child];
1845 m_solver->a_nu(childId) = m_solver->a_nu(parentId);
1849 for(
MInt dim = 0; dim < nDim; dim++) {
1850 if(m_solver->a_coordinate(childId, dim) < m_solver->a_coordinate(parentId, dim)) {
1853 position +=
IPOW2(dim);
1859 MInt interpolationNeighbors[
IPOW2(nDim)];
1861 const MInt dir = Ld::intNghbrArray(position, k);
1862 if(dir < IPOW3[nDim] - 1) {
1863 interpolationNeighbors[k] = parentNeighbors[dir];
1865 interpolationNeighbors[k] = parentId;
1871 interpolationCoefficients[k] = Ld::linearInterpolationCoefficients(position, k);
1875 std::array<MFloat, nDim> u{};
1877 std::array<MFloat, nDim> uOld{};
1881 const MInt interpNeighbor = interpolationNeighbors[m];
1882 const MFloat interpCoeff = interpolationCoefficients[m];
1885 rho += interpCoeff * m_solver->a_variable(interpNeighbor, PV->RHO);
1886 for(
MInt n = 0; n < nDim; n++) {
1887 u[n] += interpCoeff * m_solver->a_variable(interpNeighbor, PV->VV[n]);
1891 rhoOld += interpCoeff * m_solver->a_variable(interpNeighbor, PV->RHO);
1892 for(
MInt n = 0; n < nDim; n++) {
1893 uOld[n] += interpCoeff * m_solver->a_variable(interpNeighbor, PV->VV[n]);
1899 const MFloat rho_tp1 = 1.5 * rho - 0.5 * rhoOld;
1900 std::array<MFloat, nDim> u_tp1{};
1901 for(
MInt d = 0; d < nDim; d++) {
1902 u_tp1[d] = 1.5 * u[d] - 0.5 * uOld[d];
1907 MFloat rho_tp12 = 0.5 * rho + 0.5 * rhoOld;
1908 std::array<MFloat, nDim> u_tp12{};
1909 for(
MInt d = 0; d < nDim; d++) {
1910 u_tp12[d] = 0.5 * u[d] + 0.5 * uOld[d];
1914 m_solver->a_variable(childId, PV->RHO) = rho;
1915 for(
MInt n = 0; n < nDim; n++) {
1916 m_solver->a_variable(childId, PV->VV[n]) = u[n];
1918 m_solver->a_oldVariable(childId, PV->RHO) = rho_tp12;
1919 for(
MInt n = 0; n < nDim; n++) {
1920 m_solver->a_oldVariable(childId, PV->VV[n]) = u_tp12[n];
1924 std::array<MFloat, nDist> eqDist_tp1{};
1925 eqDist_tp1 = m_solver->getEqDists(rho_tp1, u_tp1.data());
1928 MFloat sumOfOldDist = F0;
1930 MBool propagateNeighborValue =
false;
1932 if(m_solver->a_hasNeighbor(childId, Ld::oppositeDist(
dist))) {
1934 propagateNeighborValue =
true;
1938 if(propagateNeighborValue) {
1939 m_solver->a_oldDistribution(childId,
dist) =
1940 m_solver->a_distribution(m_solver->c_neighborId(childId, Ld::oppositeDist(
dist)),
dist)
1941 +
FPOW2(m_solver->maxLevel() - m_solver->a_level(childId)) * forcing[
dist];
1947 interpolationCoefficients[m] * m_solver->a_oldDistribution(interpolationNeighbors[m],
dist);
1948 if(m_solver->a_hasNeighbor(interpolationNeighbors[m], Ld::oppositeDist(
dist))) {
1949 const MInt neighborId = m_solver->c_neighborId(interpolationNeighbors[m], Ld::oppositeDist(
dist));
1950 tmpDist1 += interpolationCoefficients[m] * m_solver->a_distribution(neighborId,
dist);
1951 tmpDist1 += interpolationCoefficients[m] *
FPOW2(m_solver->maxLevel() - m_solver->a_level(childId) + 1)
1953 tmpDist2 += tmpDist;
1957 tmpDist2 += tmpDist;
1958 tmpDist1 += tmpDist;
1963 m_solver->a_oldDistribution(childId,
dist) =
1964 (0.5 * (tmpDist1 + tmpDist2) - eqDist_tp1[
dist]) * (omega_C / omega_F) * F1B2 + eqDist_tp1[
dist];
1968 m_solver->a_distribution(childId,
dist) = m_solver->a_oldDistribution(childId,
dist);
1970 sumOfOldDist += m_solver->a_oldDistribution(childId,
dist);
1973 m_solver->a_oldDistribution(childId, Ld::lastId()) = rho - sumOfOldDist;
1974 m_solver->a_distribution(childId, Ld::lastId()) = rho - sumOfOldDist;
1987template <MInt nDim, MInt nDist,
class SysEqn>
1989 if(!m_solver->a_isHalo(parentId)) {
1990 for(
MInt child = 0; child <
IPOW2(nDim); child++) {
1991 if(childIds[child] < 0)
continue;
1992 for(
MInt v = 0; v < m_solver->noVariables(); v++) {
1993 m_solver->a_variable(childIds[child], v) = m_solver->a_variable(parentId, v);
1994 m_solver->a_oldVariable(childIds[child], v) = m_solver->a_oldVariable(parentId, v);
1996 for(
MInt dir = 0; dir < nDist; dir++) {
1997 m_solver->a_distribution(childIds[child], dir) = m_solver->a_distribution(parentId, dir);
1998 m_solver->a_oldDistribution(childIds[child], dir) = m_solver->a_oldDistribution(parentId, dir);
2010template <MInt nDim, MInt nDist,
class SysEqn>
2012 if(!m_solver->a_isHalo(parentId)) {
2013 std::array<MFloat, nDist> forcing{};
2014 getCellForcing(forcing);
2019 children[m] = m_solver->c_childId(parentId, m);
2022 m_solver->a_variable(parentId, PV->RHO) = 0.0;
2023 m_solver->a_variable(parentId, PV->U) = 0.0;
2024 m_solver->a_variable(parentId, PV->V) = 0.0;
2025 IF_CONSTEXPR(nDim == 3) m_solver->a_variable(parentId, PV->W) = 0.0;
2026 m_solver->a_oldVariable(parentId, PV->RHO) = 0.0;
2027 m_solver->a_oldVariable(parentId, PV->U) = 0.0;
2028 m_solver->a_oldVariable(parentId, PV->V) = 0.0;
2029 IF_CONSTEXPR(nDim == 3) m_solver->a_oldVariable(parentId, PV->W) = 0.0;
2030 for(
MInt i = 0; i < nDist; i++) {
2031 m_solver->a_distribution(parentId, i) = 0.0;
2032 m_solver->a_oldDistribution(parentId, i) = 0.0;
2037 m_solver->a_variable(parentId, PV->RHO) +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->RHO);
2038 m_solver->a_variable(parentId, PV->U) +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->U);
2039 m_solver->a_variable(parentId, PV->V) +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->V);
2040 IF_CONSTEXPR(nDim == 3)
2041 m_solver->a_variable(parentId, PV->W) +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->W);
2042 m_solver->a_oldVariable(parentId, PV->RHO) +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->RHO);
2043 m_solver->a_oldVariable(parentId, PV->U) +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->U);
2044 m_solver->a_oldVariable(parentId, PV->V) +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->V);
2045 IF_CONSTEXPR(nDim == 3)
2046 m_solver->a_oldVariable(parentId, PV->W) +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->W);
2047 for(
MInt i = 0; i < nDist; i++) {
2048 m_solver->a_distribution(parentId, i) +=
FFPOW2(nDim) * m_solver->a_distribution(children[m], i);
2049 m_solver->a_oldDistribution(parentId, i) +=
FFPOW2(nDim) * m_solver->a_oldDistribution(children[m], i);
2064template <MInt nDim, MInt nDist,
class SysEqn>
2066 if(!m_solver->a_isHalo(parentId)) {
2067 const MInt parentLevel = m_solver->c_level(parentId);
2068 const MInt dParentLevel = m_solver->maxLevel() - parentLevel;
2071 const MFloat omega_F = F2 / (F1 + 6.0 * m_solver->a_nu(parentId) *
FFPOW2(dParentLevel - 1));
2072 const MFloat omega_C = F2 / (F1 + 6.0 * m_solver->a_nu(parentId) *
FFPOW2(dParentLevel));
2073 std::array<MFloat, nDist> forcing{};
2074 getCellForcing(forcing);
2079 children[m] = m_solver->c_childId(parentId, m);
2087 MFloat uOld[nDim] = {F0};
2089 MFloat u_tp1[nDim] = {F0};
2091 MFloat u_tm3[nDim] = {F0};
2096 rho +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->RHO);
2097 for(
MInt n = 0; n < nDim; n++) {
2098 u[n] +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->VV[n]);
2101 rhoOld +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->RHO);
2102 for(
MInt n = 0; n < nDim; n++) {
2103 uOld[n] +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->VV[n]);
2109 rho_tp1 = 2 * rho - rhoOld;
2110 for(
MInt d = 0; d < nDim; d++) {
2111 u_tp1[d] = 2 * u[d] - uOld[d];
2116 rho_tm3 = 3 * rhoOld - 2 * rho;
2117 for(
MInt d = 0; d < nDim; d++) {
2118 u_tm3[d] = 3 * uOld[d] - 2 * u[d];
2122 m_solver->a_variable(parentId, PV->RHO) = rhoOld;
2123 for(
MInt n = 0; n < nDim; n++) {
2124 m_solver->a_variable(parentId, PV->VV[n]) = uOld[n];
2126 m_solver->a_oldVariable(parentId, PV->RHO) = rho_tm3;
2127 for(
MInt n = 0; n < nDim; n++) {
2128 m_solver->a_oldVariable(parentId, PV->VV[n]) = u_tm3[n];
2132 std::array<MFloat, nDist> eqDistTp1{};
2133 eqDistTp1 = m_solver->getEqDists(rho_tp1, u_tp1);
2140 tmpDist +=
FFPOW2(nDim) * m_solver->a_oldDistribution(children[m],
dist);
2143 m_solver->a_oldDistribution(parentId,
dist) =
2144 (tmpDist - eqDistTp1[
dist]) * (omega_F / omega_C) * 2.0 + eqDistTp1[
dist];
2147 m_solver->a_distribution(parentId,
dist) = m_solver->a_oldDistribution(parentId,
dist);
2151 std::array<MFloat, nDim> u{};
2153 std::array<MFloat, nDim> u_tm1{};
2158 rho +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->RHO);
2159 for(
MInt n = 0; n < nDim; n++) {
2160 u[n] +=
FFPOW2(nDim) * m_solver->a_variable(children[m], PV->VV[n]);
2163 rho_tm1 +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->RHO);
2164 for(
MInt n = 0; n < nDim; n++) {
2165 u_tm1[n] +=
FFPOW2(nDim) * m_solver->a_oldVariable(children[m], PV->VV[n]);
2171 std::array<MFloat, nDim> u_tm2{};
2172 rho_tm2 = 2 * rho_tm1 - 1 * rho;
2173 for(
MInt d = 0; d < nDim; d++) {
2174 u_tm2[d] = 2 * u_tm1[d] - 1 * u[d];
2178 m_solver->a_variable(parentId, PV->RHO) = rho;
2179 for(
MInt d = 0; d < nDim; d++) {
2180 m_solver->a_variable(parentId, PV->VV[d]) = u[d];
2182 m_solver->a_oldVariable(parentId, PV->RHO) = rho_tm2;
2183 for(
MInt d = 0; d < nDim; d++) {
2184 m_solver->a_oldVariable(parentId, PV->VV[d]) = u_tm2[d];
2188 std::array<MFloat, nDist> eqDist{};
2189 eqDist = m_solver->getEqDists(rho, u.data());
2192 const MFloat tau_F = 1 / omega_F;
2193 const MFloat tau_C = 1 / omega_C;
2198 tmpDist +=
FFPOW2(nDim) * m_solver->a_distribution(children[m],
dist);
2201 m_solver->a_distribution(parentId,
dist) =
2202 (tmpDist - eqDist[
dist]) * ((tau_C - 1) / (tau_F - 1)) * 2.0 + eqDist[
dist];
2204 m_solver->a_oldDistribution(parentId,
dist) = m_solver->a_distribution(parentId,
dist);
virtual void restriction10()
virtual void removeChildsDupuisFilippova(const MInt parentId)
Initialize parent variables from children.
void setInterfaceFunctions()
Setting function pointer to the chosen interface treatment method.
virtual void restrictionThermalRohde()
Fine to coarse grid fot thermal LB.
LbInterfaceDxQy(LbSolver< nDim > *solver)
virtual void prolongationThermalRohde()
Coarse to fine grid for thermal LB.
virtual void restrictionDupuis()
virtual void prolongationRohde()
void prolongationDupuisCompressible()
virtual void prolongation10()
virtual void prolongationDupuis()
void setAdaptationFunctions()
Setting the adaptation functions chosen via property.
virtual void refineCellDupuis(const MInt parentId, const MInt *childIds)
Initialize child variables from parent.
virtual void restrictionRohde()
virtual void prolongationThermalDupuis()
Coarse to fine grid for thermal LB.
virtual void removeChildren(const MInt parentId) override final
virtual ~LbInterfaceDxQy()
D'tor for the interface class.
virtual void restrictionThermalDupuis()
Fine to coarse grid for thermal LB.
virtual void refineCellCopyPaste(const MInt parentId, const MInt *childIds)
Initialize child variables from parent.
void prolongationDupuis_()
Coarse to fine.
void prolongation()
Performing the chosen prolongation method.
virtual void refineCell(const MInt parentId, const MInt *childIds) override final
void restrictionDupuisCompressible()
void restrictionDupuis_()
Fine to coarse grid.
void restriction()
Performing the chosen restriction method.
virtual void removeChildsCopyPaste(const MInt parentId)
Initialize parent variables from children.
This class represents all LB models.
MInt string2enum(MString theString)
This global function translates strings in their corresponding enum values (integer values)....
void mTerm(const MInt errorCode, const MString &location, const MString &message)
constexpr MLong IPOW2(MInt x)
constexpr MFloat FPOW2(MInt x)
constexpr MFloat FFPOW2(MInt x)
MFloat dist(const Point< DIM > &p, const Point< DIM > &q)