66get(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
Cell const &cell) {
67 float const &xyz0 = pdf_field->get(cell, uint_t{0
u});
68 std::array<float, 19u> pop;
69 pop[0
u] = pdf_field->getF(&xyz0, uint_t{0
u});
70 pop[1u] = pdf_field->getF(&xyz0, uint_t{1u});
71 pop[2u] = pdf_field->getF(&xyz0, uint_t{2u});
72 pop[3u] = pdf_field->getF(&xyz0, uint_t{3u});
73 pop[4u] = pdf_field->getF(&xyz0, uint_t{4u});
74 pop[5u] = pdf_field->getF(&xyz0, uint_t{5u});
75 pop[6u] = pdf_field->getF(&xyz0, uint_t{6u});
76 pop[7u] = pdf_field->getF(&xyz0, uint_t{7u});
77 pop[8u] = pdf_field->getF(&xyz0, uint_t{8u});
78 pop[9u] = pdf_field->getF(&xyz0, uint_t{9u});
79 pop[10u] = pdf_field->getF(&xyz0, uint_t{10u});
80 pop[11u] = pdf_field->getF(&xyz0, uint_t{11u});
81 pop[12u] = pdf_field->getF(&xyz0, uint_t{12u});
82 pop[13u] = pdf_field->getF(&xyz0, uint_t{13u});
83 pop[14u] = pdf_field->getF(&xyz0, uint_t{14u});
84 pop[15u] = pdf_field->getF(&xyz0, uint_t{15u});
85 pop[16u] = pdf_field->getF(&xyz0, uint_t{16u});
86 pop[17u] = pdf_field->getF(&xyz0, uint_t{17u});
87 pop[18u] = pdf_field->getF(&xyz0, uint_t{18u});
91inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
92 std::array<float, 19u>
const &pop,
Cell const &cell) {
93 float &xyz0 = pdf_field->get(cell, uint_t{0
u});
94 pdf_field->getF(&xyz0, uint_t{0
u}) = pop[0
u];
95 pdf_field->getF(&xyz0, uint_t{1u}) = pop[1u];
96 pdf_field->getF(&xyz0, uint_t{2u}) = pop[2u];
97 pdf_field->getF(&xyz0, uint_t{3u}) = pop[3u];
98 pdf_field->getF(&xyz0, uint_t{4u}) = pop[4u];
99 pdf_field->getF(&xyz0, uint_t{5u}) = pop[5u];
100 pdf_field->getF(&xyz0, uint_t{6u}) = pop[6u];
101 pdf_field->getF(&xyz0, uint_t{7u}) = pop[7u];
102 pdf_field->getF(&xyz0, uint_t{8u}) = pop[8u];
103 pdf_field->getF(&xyz0, uint_t{9u}) = pop[9u];
104 pdf_field->getF(&xyz0, uint_t{10u}) = pop[10u];
105 pdf_field->getF(&xyz0, uint_t{11u}) = pop[11u];
106 pdf_field->getF(&xyz0, uint_t{12u}) = pop[12u];
107 pdf_field->getF(&xyz0, uint_t{13u}) = pop[13u];
108 pdf_field->getF(&xyz0, uint_t{14u}) = pop[14u];
109 pdf_field->getF(&xyz0, uint_t{15u}) = pop[15u];
110 pdf_field->getF(&xyz0, uint_t{16u}) = pop[16u];
111 pdf_field->getF(&xyz0, uint_t{17u}) = pop[17u];
112 pdf_field->getF(&xyz0, uint_t{18u}) = pop[18u];
115inline void initialize(GhostLayerField<
float, uint_t{19u}> *pdf_field,
116 std::array<float, 19u>
const &pop) {
117 WALBERLA_FOR_ALL_CELLS_INCLUDING_GHOST_LAYER_XYZ(pdf_field, {
118 float &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
119 pdf_field->getF(&xyz0, uint_t{0
u}) = pop[0
u];
120 pdf_field->getF(&xyz0, uint_t{1u}) = pop[1u];
121 pdf_field->getF(&xyz0, uint_t{2u}) = pop[2u];
122 pdf_field->getF(&xyz0, uint_t{3u}) = pop[3u];
123 pdf_field->getF(&xyz0, uint_t{4u}) = pop[4u];
124 pdf_field->getF(&xyz0, uint_t{5u}) = pop[5u];
125 pdf_field->getF(&xyz0, uint_t{6u}) = pop[6u];
126 pdf_field->getF(&xyz0, uint_t{7u}) = pop[7u];
127 pdf_field->getF(&xyz0, uint_t{8u}) = pop[8u];
128 pdf_field->getF(&xyz0, uint_t{9u}) = pop[9u];
129 pdf_field->getF(&xyz0, uint_t{10u}) = pop[10u];
130 pdf_field->getF(&xyz0, uint_t{11u}) = pop[11u];
131 pdf_field->getF(&xyz0, uint_t{12u}) = pop[12u];
132 pdf_field->getF(&xyz0, uint_t{13u}) = pop[13u];
133 pdf_field->getF(&xyz0, uint_t{14u}) = pop[14u];
134 pdf_field->getF(&xyz0, uint_t{15u}) = pop[15u];
135 pdf_field->getF(&xyz0, uint_t{16u}) = pop[16u];
136 pdf_field->getF(&xyz0, uint_t{17u}) = pop[17u];
137 pdf_field->getF(&xyz0, uint_t{18u}) = pop[18u];
142get(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
143 CellInterval
const &ci) {
144 std::vector<float> out;
145 out.reserve(ci.numCells() * uint_t(19u));
146 for (
auto x = ci.xMin(); x <= ci.xMax(); ++x) {
147 for (
auto y = ci.yMin(); y <= ci.yMax(); ++y) {
148 for (
auto z = ci.zMin(); z <= ci.zMax(); ++z) {
149 float const &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
150 out.emplace_back(pdf_field->getF(&xyz0, uint_t{0u}));
151 out.emplace_back(pdf_field->getF(&xyz0, uint_t{1u}));
152 out.emplace_back(pdf_field->getF(&xyz0, uint_t{2u}));
153 out.emplace_back(pdf_field->getF(&xyz0, uint_t{3u}));
154 out.emplace_back(pdf_field->getF(&xyz0, uint_t{4u}));
155 out.emplace_back(pdf_field->getF(&xyz0, uint_t{5u}));
156 out.emplace_back(pdf_field->getF(&xyz0, uint_t{6u}));
157 out.emplace_back(pdf_field->getF(&xyz0, uint_t{7u}));
158 out.emplace_back(pdf_field->getF(&xyz0, uint_t{8u}));
159 out.emplace_back(pdf_field->getF(&xyz0, uint_t{9u}));
160 out.emplace_back(pdf_field->getF(&xyz0, uint_t{10u}));
161 out.emplace_back(pdf_field->getF(&xyz0, uint_t{11u}));
162 out.emplace_back(pdf_field->getF(&xyz0, uint_t{12u}));
163 out.emplace_back(pdf_field->getF(&xyz0, uint_t{13u}));
164 out.emplace_back(pdf_field->getF(&xyz0, uint_t{14u}));
165 out.emplace_back(pdf_field->getF(&xyz0, uint_t{15u}));
166 out.emplace_back(pdf_field->getF(&xyz0, uint_t{16u}));
167 out.emplace_back(pdf_field->getF(&xyz0, uint_t{17u}));
168 out.emplace_back(pdf_field->getF(&xyz0, uint_t{18u}));
175inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
176 std::vector<float>
const &values, CellInterval
const &ci) {
177 assert(uint_c(values.size()) == ci.numCells() * uint_t(19u));
178 auto values_ptr = values.data();
179 for (
auto x = ci.xMin(); x <= ci.xMax(); ++x) {
180 for (
auto y = ci.yMin(); y <= ci.yMax(); ++y) {
181 for (
auto z = ci.zMin(); z <= ci.zMax(); ++z) {
182 float &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
183 pdf_field->getF(&xyz0, uint_t{0
u}) = values_ptr[0
u];
184 pdf_field->getF(&xyz0, uint_t{1u}) = values_ptr[1u];
185 pdf_field->getF(&xyz0, uint_t{2u}) = values_ptr[2u];
186 pdf_field->getF(&xyz0, uint_t{3u}) = values_ptr[3u];
187 pdf_field->getF(&xyz0, uint_t{4u}) = values_ptr[4u];
188 pdf_field->getF(&xyz0, uint_t{5u}) = values_ptr[5u];
189 pdf_field->getF(&xyz0, uint_t{6u}) = values_ptr[6u];
190 pdf_field->getF(&xyz0, uint_t{7u}) = values_ptr[7u];
191 pdf_field->getF(&xyz0, uint_t{8u}) = values_ptr[8u];
192 pdf_field->getF(&xyz0, uint_t{9u}) = values_ptr[9u];
193 pdf_field->getF(&xyz0, uint_t{10u}) = values_ptr[10u];
194 pdf_field->getF(&xyz0, uint_t{11u}) = values_ptr[11u];
195 pdf_field->getF(&xyz0, uint_t{12u}) = values_ptr[12u];
196 pdf_field->getF(&xyz0, uint_t{13u}) = values_ptr[13u];
197 pdf_field->getF(&xyz0, uint_t{14u}) = values_ptr[14u];
198 pdf_field->getF(&xyz0, uint_t{15u}) = values_ptr[15u];
199 pdf_field->getF(&xyz0, uint_t{16u}) = values_ptr[16u];
200 pdf_field->getF(&xyz0, uint_t{17u}) = values_ptr[17u];
201 pdf_field->getF(&xyz0, uint_t{18u}) = values_ptr[18u];
293inline float get(stencil::Direction
const direction,
294 Vector3<float>
const &
u = Vector3<float>(
float(0.0)),
295 float rho =
float(1.0)) {
297 using namespace stencil;
300 return rho * -0.33333333333333331f * (
u[0] *
u[0]) +
301 rho * -0.33333333333333331f * (
u[1] *
u[1]) +
302 rho * -0.33333333333333331f * (
u[2] *
u[2]) +
303 rho * 0.33333333333333331f;
305 return rho * -0.16666666666666666f * (
u[0] *
u[0]) +
306 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
307 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[1] +
308 rho * 0.16666666666666666f * (
u[1] *
u[1]);
310 return rho * -0.16666666666666666f *
u[1] +
311 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
312 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
313 rho * 0.055555555555555552f +
314 rho * 0.16666666666666666f * (
u[1] *
u[1]);
316 return rho * -0.16666666666666666f *
u[0] +
317 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
318 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
319 rho * 0.055555555555555552f +
320 rho * 0.16666666666666666f * (
u[0] *
u[0]);
322 return rho * -0.16666666666666666f * (
u[1] *
u[1]) +
323 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
324 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[0] +
325 rho * 0.16666666666666666f * (
u[0] *
u[0]);
327 return rho * -0.16666666666666666f * (
u[0] *
u[0]) +
328 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
329 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[2] +
330 rho * 0.16666666666666666f * (
u[2] *
u[2]);
332 return rho * -0.16666666666666666f *
u[2] +
333 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
334 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
335 rho * 0.055555555555555552f +
336 rho * 0.16666666666666666f * (
u[2] *
u[2]);
338 return rho * -0.083333333333333329f *
u[0] + rho * -0.25f *
u[0] *
u[1] +
339 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
340 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
341 rho * 0.083333333333333329f * (
u[1] *
u[1]);
343 return rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
344 rho * 0.083333333333333329f *
u[1] +
345 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
346 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
347 rho * 0.25f *
u[0] *
u[1];
349 return rho * -0.083333333333333329f *
u[0] +
350 rho * -0.083333333333333329f *
u[1] + rho * 0.027777777777777776f +
351 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
352 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
353 rho * 0.25f *
u[0] *
u[1];
355 return rho * -0.083333333333333329f *
u[1] + rho * -0.25f *
u[0] *
u[1] +
356 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
357 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
358 rho * 0.083333333333333329f * (
u[1] *
u[1]);
360 return rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
361 rho * 0.083333333333333329f *
u[2] +
362 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
363 rho * 0.083333333333333329f * (
u[2] *
u[2]) +
364 rho * 0.25f *
u[1] *
u[2];
366 return rho * -0.083333333333333329f *
u[1] + rho * -0.25f *
u[1] *
u[2] +
367 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[2] +
368 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
369 rho * 0.083333333333333329f * (
u[2] *
u[2]);
371 return rho * -0.083333333333333329f *
u[0] + rho * -0.25f *
u[0] *
u[2] +
372 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[2] +
373 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
374 rho * 0.083333333333333329f * (
u[2] *
u[2]);
376 return rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
377 rho * 0.083333333333333329f *
u[2] +
378 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
379 rho * 0.083333333333333329f * (
u[2] *
u[2]) +
380 rho * 0.25f *
u[0] *
u[2];
382 return rho * -0.083333333333333329f *
u[2] + rho * -0.25f *
u[1] *
u[2] +
383 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
384 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
385 rho * 0.083333333333333329f * (
u[2] *
u[2]);
387 return rho * -0.083333333333333329f *
u[1] +
388 rho * -0.083333333333333329f *
u[2] + rho * 0.027777777777777776f +
389 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
390 rho * 0.083333333333333329f * (
u[2] *
u[2]) +
391 rho * 0.25f *
u[1] *
u[2];
393 return rho * -0.083333333333333329f *
u[0] +
394 rho * -0.083333333333333329f *
u[2] + rho * 0.027777777777777776f +
395 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
396 rho * 0.083333333333333329f * (
u[2] *
u[2]) +
397 rho * 0.25f *
u[0] *
u[2];
399 return rho * -0.083333333333333329f *
u[2] + rho * -0.25f *
u[0] *
u[2] +
400 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
401 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
402 rho * 0.083333333333333329f * (
u[2] *
u[2]);
404 WALBERLA_ABORT(
"Invalid Direction")
410inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
411 Vector3<float>
const &
u,
float const rho,
Cell const &cell) {
413 float &xyz0 = pdf_field->get(cell, uint_t{0
u});
414 pdf_field->getF(&xyz0, uint_t{0
u}) =
415 rho * -0.33333333333333331f * (
u[0] *
u[0]) +
416 rho * -0.33333333333333331f * (
u[1] *
u[1]) +
417 rho * -0.33333333333333331f * (
u[2] *
u[2]) + rho * 0.33333333333333331f;
418 pdf_field->getF(&xyz0, uint_t{1u}) =
419 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
420 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
421 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[1] +
422 rho * 0.16666666666666666f * (
u[1] *
u[1]);
423 pdf_field->getF(&xyz0, uint_t{2u}) =
424 rho * -0.16666666666666666f *
u[1] +
425 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
426 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
427 rho * 0.055555555555555552f + rho * 0.16666666666666666f * (
u[1] *
u[1]);
428 pdf_field->getF(&xyz0, uint_t{3u}) =
429 rho * -0.16666666666666666f *
u[0] +
430 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
431 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
432 rho * 0.055555555555555552f + rho * 0.16666666666666666f * (
u[0] *
u[0]);
433 pdf_field->getF(&xyz0, uint_t{4u}) =
434 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
435 rho * -0.16666666666666666f * (
u[2] *
u[2]) +
436 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[0] +
437 rho * 0.16666666666666666f * (
u[0] *
u[0]);
438 pdf_field->getF(&xyz0, uint_t{5u}) =
439 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
440 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
441 rho * 0.055555555555555552f + rho * 0.16666666666666666f *
u[2] +
442 rho * 0.16666666666666666f * (
u[2] *
u[2]);
443 pdf_field->getF(&xyz0, uint_t{6u}) =
444 rho * -0.16666666666666666f *
u[2] +
445 rho * -0.16666666666666666f * (
u[0] *
u[0]) +
446 rho * -0.16666666666666666f * (
u[1] *
u[1]) +
447 rho * 0.055555555555555552f + rho * 0.16666666666666666f * (
u[2] *
u[2]);
448 pdf_field->getF(&xyz0, uint_t{7u}) =
449 rho * -0.083333333333333329f *
u[0] + rho * -0.25f *
u[0] *
u[1] +
450 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
451 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
452 rho * 0.083333333333333329f * (
u[1] *
u[1]);
453 pdf_field->getF(&xyz0, uint_t{8u}) =
454 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
455 rho * 0.083333333333333329f *
u[1] +
456 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
457 rho * 0.083333333333333329f * (
u[1] *
u[1]) + rho * 0.25f *
u[0] *
u[1];
458 pdf_field->getF(&xyz0, uint_t{9u}) =
459 rho * -0.083333333333333329f *
u[0] +
460 rho * -0.083333333333333329f *
u[1] + rho * 0.027777777777777776f +
461 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
462 rho * 0.083333333333333329f * (
u[1] *
u[1]) + rho * 0.25f *
u[0] *
u[1];
463 pdf_field->getF(&xyz0, uint_t{10u}) =
464 rho * -0.083333333333333329f *
u[1] + rho * -0.25f *
u[0] *
u[1] +
465 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
466 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
467 rho * 0.083333333333333329f * (
u[1] *
u[1]);
468 pdf_field->getF(&xyz0, uint_t{11u}) =
469 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
470 rho * 0.083333333333333329f *
u[2] +
471 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
472 rho * 0.083333333333333329f * (
u[2] *
u[2]) + rho * 0.25f *
u[1] *
u[2];
473 pdf_field->getF(&xyz0, uint_t{12u}) =
474 rho * -0.083333333333333329f *
u[1] + rho * -0.25f *
u[1] *
u[2] +
475 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[2] +
476 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
477 rho * 0.083333333333333329f * (
u[2] *
u[2]);
478 pdf_field->getF(&xyz0, uint_t{13u}) =
479 rho * -0.083333333333333329f *
u[0] + rho * -0.25f *
u[0] *
u[2] +
480 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[2] +
481 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
482 rho * 0.083333333333333329f * (
u[2] *
u[2]);
483 pdf_field->getF(&xyz0, uint_t{14u}) =
484 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
485 rho * 0.083333333333333329f *
u[2] +
486 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
487 rho * 0.083333333333333329f * (
u[2] *
u[2]) + rho * 0.25f *
u[0] *
u[2];
488 pdf_field->getF(&xyz0, uint_t{15u}) =
489 rho * -0.083333333333333329f *
u[2] + rho * -0.25f *
u[1] *
u[2] +
490 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[1] +
491 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
492 rho * 0.083333333333333329f * (
u[2] *
u[2]);
493 pdf_field->getF(&xyz0, uint_t{16u}) =
494 rho * -0.083333333333333329f *
u[1] +
495 rho * -0.083333333333333329f *
u[2] + rho * 0.027777777777777776f +
496 rho * 0.083333333333333329f * (
u[1] *
u[1]) +
497 rho * 0.083333333333333329f * (
u[2] *
u[2]) + rho * 0.25f *
u[1] *
u[2];
498 pdf_field->getF(&xyz0, uint_t{17u}) =
499 rho * -0.083333333333333329f *
u[0] +
500 rho * -0.083333333333333329f *
u[2] + rho * 0.027777777777777776f +
501 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
502 rho * 0.083333333333333329f * (
u[2] *
u[2]) + rho * 0.25f *
u[0] *
u[2];
503 pdf_field->getF(&xyz0, uint_t{18u}) =
504 rho * -0.083333333333333329f *
u[2] + rho * -0.25f *
u[0] *
u[2] +
505 rho * 0.027777777777777776f + rho * 0.083333333333333329f *
u[0] +
506 rho * 0.083333333333333329f * (
u[0] *
u[0]) +
507 rho * 0.083333333333333329f * (
u[2] *
u[2]);
512inline float get(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
514 const float &xyz0 = pdf_field->get(cell, uint_t{0
u});
515 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
516 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
517 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
518 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
519 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
520 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
521 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
522 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
523 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
524 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
525 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
526 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
527 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
528 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
529 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
530 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
531 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
532 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
533 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
534 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
535 const float vel1Term = f_1 + f_11 + f_15 + f_7;
536 const float vel2Term = f_12 + f_13 + f_5;
537 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
542inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
543 float const rho_in,
Cell const &cell) {
544 const float &xyz0 = pdf_field->get(cell, uint_t{0
u});
545 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
546 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
547 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
548 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
549 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
550 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
551 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
552 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
553 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
554 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
555 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
556 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
557 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
558 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
559 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
560 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
561 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
562 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
563 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
564 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
565 const float momdensity_0 = -f_13 - f_17 - f_3 - f_7 - f_9 + vel0Term;
566 const float vel1Term = f_1 + f_11 + f_15 + f_7;
567 const float momdensity_1 = -f_10 - f_12 - f_16 - f_2 + f_8 - f_9 + vel1Term;
568 const float vel2Term = f_12 + f_13 + f_5;
569 const float momdensity_2 =
570 f_11 + f_14 - f_15 - f_16 - f_17 - f_18 - f_6 + vel2Term;
571 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
575 const float conversion = float(1) / rho;
577 velocity[0
u] = momdensity_0 * conversion;
578 velocity[1u] = momdensity_1 * conversion;
579 velocity[2u] = momdensity_2 * conversion;
585get(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
586 CellInterval
const &ci) {
587 std::vector<float> out;
588 out.reserve(ci.numCells());
589 for (
auto x = ci.xMin(); x <= ci.xMax(); ++x) {
590 for (
auto y = ci.yMin(); y <= ci.yMax(); ++y) {
591 for (
auto z = ci.zMin(); z <= ci.zMax(); ++z) {
592 const float &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
593 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
594 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
595 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
596 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
597 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
598 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
599 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
600 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
601 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
602 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
603 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
604 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
605 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
606 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
607 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
608 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
609 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
610 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
611 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
612 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
613 const float vel1Term = f_1 + f_11 + f_15 + f_7;
614 const float vel2Term = f_12 + f_13 + f_5;
615 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
617 out.emplace_back(rho);
624inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
625 std::vector<float>
const &values, CellInterval
const &ci) {
626 assert(uint_c(values.size()) == ci.numCells());
627 auto values_it = values.begin();
628 for (
auto x = ci.xMin(); x <= ci.xMax(); ++x) {
629 for (
auto y = ci.yMin(); y <= ci.yMax(); ++y) {
630 for (
auto z = ci.zMin(); z <= ci.zMax(); ++z) {
631 const float &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
632 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
633 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
634 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
635 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
636 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
637 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
638 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
639 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
640 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
641 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
642 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
643 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
644 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
645 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
646 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
647 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
648 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
649 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
650 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
651 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
652 const float momdensity_0 = -f_13 - f_17 - f_3 - f_7 - f_9 + vel0Term;
653 const float vel1Term = f_1 + f_11 + f_15 + f_7;
654 const float momdensity_1 =
655 -f_10 - f_12 - f_16 - f_2 + f_8 - f_9 + vel1Term;
656 const float vel2Term = f_12 + f_13 + f_5;
657 const float momdensity_2 =
658 f_11 + f_14 - f_15 - f_16 - f_17 - f_18 - f_6 + vel2Term;
659 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
663 const float conversion = float(1) / rho;
665 velocity[0
u] = momdensity_0 * conversion;
666 velocity[1u] = momdensity_1 * conversion;
667 velocity[2u] = momdensity_2 * conversion;
678inline void set(GhostLayerField<
float, uint_t{19u}> *pdf_field,
679 GhostLayerField<float, uint_t{3u}>
const *force_field,
680 Vector3<float>
const &
u,
Cell const &cell) {
681 const float &xyz0 = pdf_field->get(cell, uint_t{0
u});
682 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
683 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
684 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
685 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
686 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
687 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
688 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
689 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
690 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
691 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
692 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
693 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
694 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
695 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
696 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
697 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
698 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
699 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
700 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
701 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
702 const float vel1Term = f_1 + f_11 + f_15 + f_7;
703 const float vel2Term = f_12 + f_13 + f_5;
704 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
707 const auto x = cell.x();
708 const auto y = cell.y();
709 const auto z = cell.z();
711 -force_field->get(x, y, z, 0) * 0.50000000000000000f / rho +
u[0];
713 -force_field->get(x, y, z, 1) * 0.50000000000000000f / rho +
u[1];
715 -force_field->get(x, y, z, 2) * 0.50000000000000000f / rho +
u[2];
723reduce(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
724 GhostLayerField<float, uint_t{3u}>
const *force_field) {
725 Vector3<float> momentumDensity(
float{0});
726 WALBERLA_FOR_ALL_CELLS_XYZ(pdf_field, {
727 const float &xyz0 = pdf_field->get(x, y, z, uint_t{0
u});
728 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
729 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
730 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
731 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
732 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
733 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
734 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
735 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
736 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
737 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
738 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
739 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
740 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
741 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
742 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
743 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
744 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
745 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
746 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
747 const float vel0Term = f_10 + f_14 + f_18 + f_4 + f_8;
748 const float momdensity_0 = -f_13 - f_17 - f_3 - f_7 - f_9 + vel0Term;
749 const float vel1Term = f_1 + f_11 + f_15 + f_7;
750 const float momdensity_1 = -f_10 - f_12 - f_16 - f_2 + f_8 - f_9 + vel1Term;
751 const float vel2Term = f_12 + f_13 + f_5;
752 const float momdensity_2 =
753 f_11 + f_14 - f_15 - f_16 - f_17 - f_18 - f_6 + vel2Term;
754 const float rho = f_0 + f_16 + f_17 + f_2 + f_3 + f_6 + f_9 + vel0Term +
757 force_field->get(x, y, z, 0) * 0.50000000000000000f + momdensity_0;
759 force_field->get(x, y, z, 1) * 0.50000000000000000f + momdensity_1;
761 force_field->get(x, y, z, 2) * 0.50000000000000000f + momdensity_2;
763 momentumDensity[0
u] += md_0;
764 momentumDensity[1u] += md_1;
765 momentumDensity[2u] += md_2;
767 return momentumDensity;
772inline Matrix3<float>
get(GhostLayerField<
float, uint_t{19u}>
const *pdf_field,
774 const float &xyz0 = pdf_field->get(cell, uint_t{0
u});
775 const float f_0 = pdf_field->getF(&xyz0, uint_t{0
u});
776 const float f_1 = pdf_field->getF(&xyz0, uint_t{1u});
777 const float f_2 = pdf_field->getF(&xyz0, uint_t{2u});
778 const float f_3 = pdf_field->getF(&xyz0, uint_t{3u});
779 const float f_4 = pdf_field->getF(&xyz0, uint_t{4u});
780 const float f_5 = pdf_field->getF(&xyz0, uint_t{5u});
781 const float f_6 = pdf_field->getF(&xyz0, uint_t{6u});
782 const float f_7 = pdf_field->getF(&xyz0, uint_t{7u});
783 const float f_8 = pdf_field->getF(&xyz0, uint_t{8u});
784 const float f_9 = pdf_field->getF(&xyz0, uint_t{9u});
785 const float f_10 = pdf_field->getF(&xyz0, uint_t{10u});
786 const float f_11 = pdf_field->getF(&xyz0, uint_t{11u});
787 const float f_12 = pdf_field->getF(&xyz0, uint_t{12u});
788 const float f_13 = pdf_field->getF(&xyz0, uint_t{13u});
789 const float f_14 = pdf_field->getF(&xyz0, uint_t{14u});
790 const float f_15 = pdf_field->getF(&xyz0, uint_t{15u});
791 const float f_16 = pdf_field->getF(&xyz0, uint_t{16u});
792 const float f_17 = pdf_field->getF(&xyz0, uint_t{17u});
793 const float f_18 = pdf_field->getF(&xyz0, uint_t{18u});
795 f_10 + f_13 + f_14 + f_17 + f_18 + f_3 + f_4 + f_7 + f_8 + f_9;
796 const float p_1 = -f_10 - f_7 + f_8 + f_9;
797 const float p_2 = -f_13 + f_14 + f_17 - f_18;
798 const float p_3 = -f_10 - f_7 + f_8 + f_9;
800 f_1 + f_10 + f_11 + f_12 + f_15 + f_16 + f_2 + f_7 + f_8 + f_9;
801 const float p_5 = f_11 - f_12 - f_15 + f_16;
802 const float p_6 = -f_13 + f_14 + f_17 - f_18;
803 const float p_7 = f_11 - f_12 - f_15 + f_16;
805 f_11 + f_12 + f_13 + f_14 + f_15 + f_16 + f_17 + f_18 + f_5 + f_6;
807 Matrix3<float> pressureTensor;
808 pressureTensor[0
u] = p_0;
809 pressureTensor[1u] = p_1;
810 pressureTensor[2u] = p_2;
812 pressureTensor[3u] = p_3;
813 pressureTensor[4u] = p_4;
814 pressureTensor[5u] = p_5;
816 pressureTensor[6u] = p_6;
817 pressureTensor[7u] = p_7;
818 pressureTensor[8u] = p_8;
820 return pressureTensor;