247inline auto get_vector(GhostLayerField<
float, uint_t{13u}>
const *flux_field,
249 Vector3<float> result = Vector3<float>(0, 0, 0);
250 const float &xyz0 = flux_field->get(cell, uint_t{0u});
251 std::array<float, 27u> local_value;
253 local_value[0] = float(0.0);
254 local_value[1] = float(-0.5) * flux_field->getNeighbor(
255 cell.x(), cell.y(), cell.z(), uint_t{1u},
256 stencil::Direction(uint_t{1u}));
257 local_value[2] = float(0.5) * flux_field->getF(&xyz0, uint_t{1u});
258 local_value[3] = float(0.5) * flux_field->getF(&xyz0, uint_t{0u});
259 local_value[4] = float(-0.5) * flux_field->getNeighbor(
260 cell.x(), cell.y(), cell.z(), uint_t{0u},
261 stencil::Direction(uint_t{4u}));
262 local_value[5] = float(-0.5) * flux_field->getNeighbor(
263 cell.x(), cell.y(), cell.z(), uint_t{2u},
264 stencil::Direction(uint_t{5u}));
265 local_value[6] = float(0.5) * flux_field->getF(&xyz0, uint_t{2u});
266 local_value[7] = float(0.5) * flux_field->getF(&xyz0, uint_t{4u});
267 local_value[8] = float(-0.5) * flux_field->getNeighbor(
268 cell.x(), cell.y(), cell.z(), uint_t{3u},
269 stencil::Direction(uint_t{8u}));
270 local_value[9] = float(0.5) * flux_field->getF(&xyz0, uint_t{3u});
271 local_value[10] = float(-0.5) * flux_field->getNeighbor(
272 cell.x(), cell.y(), cell.z(), uint_t{4u},
273 stencil::Direction(uint_t{10u}));
274 local_value[11] = float(-0.5) * flux_field->getNeighbor(
275 cell.x(), cell.y(), cell.z(), uint_t{7u},
276 stencil::Direction(uint_t{11u}));
277 local_value[12] = float(0.5) * flux_field->getF(&xyz0, uint_t{8u});
278 local_value[13] = float(0.5) * flux_field->getF(&xyz0, uint_t{6u});
279 local_value[14] = float(-0.5) * flux_field->getNeighbor(
280 cell.x(), cell.y(), cell.z(), uint_t{5u},
281 stencil::Direction(uint_t{14u}));
282 local_value[15] = float(-0.5) * flux_field->getNeighbor(
283 cell.x(), cell.y(), cell.z(), uint_t{8u},
284 stencil::Direction(uint_t{15u}));
285 local_value[16] = float(0.5) * flux_field->getF(&xyz0, uint_t{7u});
286 local_value[17] = float(0.5) * flux_field->getF(&xyz0, uint_t{5u});
287 local_value[18] = float(-0.5) * flux_field->getNeighbor(
288 cell.x(), cell.y(), cell.z(), uint_t{6u},
289 stencil::Direction(uint_t{18u}));
290 local_value[19] = float(-0.5) * flux_field->getNeighbor(
291 cell.x(), cell.y(), cell.z(), uint_t{9u},
292 stencil::Direction(uint_t{19u}));
293 local_value[20] = float(0.5) * flux_field->getF(&xyz0, uint_t{12u});
294 local_value[21] = float(-0.5) * flux_field->getNeighbor(
295 cell.x(), cell.y(), cell.z(), uint_t{11u},
296 stencil::Direction(uint_t{21u}));
297 local_value[22] = float(0.5) * flux_field->getF(&xyz0, uint_t{10u});
298 local_value[23] = float(-0.5) * flux_field->getNeighbor(
299 cell.x(), cell.y(), cell.z(), uint_t{10u},
300 stencil::Direction(uint_t{23u}));
301 local_value[24] = float(0.5) * flux_field->getF(&xyz0, uint_t{11u});
302 local_value[25] = float(-0.5) * flux_field->getNeighbor(
303 cell.x(), cell.y(), cell.z(), uint_t{12u},
304 stencil::Direction(uint_t{25u}));
305 local_value[26] = float(0.5) * flux_field->getF(&xyz0, uint_t{9u});
307 result[1] += local_value[1] * 1;
309 result[1] += local_value[2] * -1;
311 result[0] += local_value[3] * -1;
313 result[0] += local_value[4] * 1;
315 result[2] += local_value[5] * 1;
317 result[2] += local_value[6] * -1;
319 result[0] += local_value[7] * -1;
320 result[1] += local_value[7] * 1;
322 result[0] += local_value[8] * 1;
323 result[1] += local_value[8] * 1;
325 result[0] += local_value[9] * -1;
326 result[1] += local_value[9] * -1;
328 result[0] += local_value[10] * 1;
329 result[1] += local_value[10] * -1;
331 result[1] += local_value[11] * 1;
332 result[2] += local_value[11] * 1;
334 result[1] += local_value[12] * -1;
335 result[2] += local_value[12] * 1;
337 result[0] += local_value[13] * -1;
338 result[2] += local_value[13] * 1;
340 result[0] += local_value[14] * 1;
341 result[2] += local_value[14] * 1;
343 result[1] += local_value[15] * 1;
344 result[2] += local_value[15] * -1;
346 result[1] += local_value[16] * -1;
347 result[2] += local_value[16] * -1;
349 result[0] += local_value[17] * -1;
350 result[2] += local_value[17] * -1;
352 result[0] += local_value[18] * 1;
353 result[2] += local_value[18] * -1;
355 result[0] += local_value[19] * 1;
356 result[1] += local_value[19] * 1;
357 result[2] += local_value[19] * 1;
359 result[0] += local_value[20] * -1;
360 result[1] += local_value[20] * 1;
361 result[2] += local_value[20] * 1;
363 result[0] += local_value[21] * 1;
364 result[1] += local_value[21] * -1;
365 result[2] += local_value[21] * 1;
367 result[0] += local_value[22] * -1;
368 result[1] += local_value[22] * -1;
369 result[2] += local_value[22] * 1;
371 result[0] += local_value[23] * 1;
372 result[1] += local_value[23] * 1;
373 result[2] += local_value[23] * -1;
375 result[0] += local_value[24] * -1;
376 result[1] += local_value[24] * 1;
377 result[2] += local_value[24] * -1;
379 result[0] += local_value[25] * 1;
380 result[1] += local_value[25] * -1;
381 result[2] += local_value[25] * -1;
383 result[0] += local_value[26] * -1;
384 result[1] += local_value[26] * -1;
385 result[2] += local_value[26] * -1;
390inline auto get_vector(GhostLayerField<
float, uint_t{13u}>
const *flux_field,
391 CellInterval
const &ci) {
392 std::vector<float> out;
393 out.reserve(ci.numCells() * uint_t(3u));
394 for (
auto x = ci.xMin(); x <= ci.xMax(); ++x) {
395 for (
auto y = ci.yMin(); y <= ci.yMax(); ++y) {
396 for (
auto z = ci.zMin(); z <= ci.zMax(); ++z) {
397 Vector3<float> result = Vector3<float>(0, 0, 0);
398 const float &xyz0 = flux_field->get(x, y, z, uint_t{0u});
399 std::array<float, 27u> local_value;
401 local_value[0] = float(0.0);
402 local_value[1] = float(-0.5) * flux_field->getNeighbor(
404 stencil::Direction(uint_t{1u}));
405 local_value[2] = float(0.5) * flux_field->getF(&xyz0, uint_t{1u});
406 local_value[3] = float(0.5) * flux_field->getF(&xyz0, uint_t{0u});
407 local_value[4] = float(-0.5) * flux_field->getNeighbor(
409 stencil::Direction(uint_t{4u}));
410 local_value[5] = float(-0.5) * flux_field->getNeighbor(
412 stencil::Direction(uint_t{5u}));
413 local_value[6] = float(0.5) * flux_field->getF(&xyz0, uint_t{2u});
414 local_value[7] = float(0.5) * flux_field->getF(&xyz0, uint_t{4u});
415 local_value[8] = float(-0.5) * flux_field->getNeighbor(
417 stencil::Direction(uint_t{8u}));
418 local_value[9] = float(0.5) * flux_field->getF(&xyz0, uint_t{3u});
419 local_value[10] = float(-0.5) * flux_field->getNeighbor(
421 stencil::Direction(uint_t{10u}));
422 local_value[11] = float(-0.5) * flux_field->getNeighbor(
424 stencil::Direction(uint_t{11u}));
425 local_value[12] = float(0.5) * flux_field->getF(&xyz0, uint_t{8u});
426 local_value[13] = float(0.5) * flux_field->getF(&xyz0, uint_t{6u});
427 local_value[14] = float(-0.5) * flux_field->getNeighbor(
429 stencil::Direction(uint_t{14u}));
430 local_value[15] = float(-0.5) * flux_field->getNeighbor(
432 stencil::Direction(uint_t{15u}));
433 local_value[16] = float(0.5) * flux_field->getF(&xyz0, uint_t{7u});
434 local_value[17] = float(0.5) * flux_field->getF(&xyz0, uint_t{5u});
435 local_value[18] = float(-0.5) * flux_field->getNeighbor(
437 stencil::Direction(uint_t{18u}));
438 local_value[19] = float(-0.5) * flux_field->getNeighbor(
440 stencil::Direction(uint_t{19u}));
441 local_value[20] = float(0.5) * flux_field->getF(&xyz0, uint_t{12u});
442 local_value[21] = float(-0.5) * flux_field->getNeighbor(
443 x, y, z, uint_t{11u},
444 stencil::Direction(uint_t{21u}));
445 local_value[22] = float(0.5) * flux_field->getF(&xyz0, uint_t{10u});
446 local_value[23] = float(-0.5) * flux_field->getNeighbor(
447 x, y, z, uint_t{10u},
448 stencil::Direction(uint_t{23u}));
449 local_value[24] = float(0.5) * flux_field->getF(&xyz0, uint_t{11u});
450 local_value[25] = float(-0.5) * flux_field->getNeighbor(
451 x, y, z, uint_t{12u},
452 stencil::Direction(uint_t{25u}));
453 local_value[26] = float(0.5) * flux_field->getF(&xyz0, uint_t{9u});
455 result[1] += local_value[1] * 1;
457 result[1] += local_value[2] * -1;
459 result[0] += local_value[3] * -1;
461 result[0] += local_value[4] * 1;
463 result[2] += local_value[5] * 1;
465 result[2] += local_value[6] * -1;
467 result[0] += local_value[7] * -1;
468 result[1] += local_value[7] * 1;
470 result[0] += local_value[8] * 1;
471 result[1] += local_value[8] * 1;
473 result[0] += local_value[9] * -1;
474 result[1] += local_value[9] * -1;
476 result[0] += local_value[10] * 1;
477 result[1] += local_value[10] * -1;
479 result[1] += local_value[11] * 1;
480 result[2] += local_value[11] * 1;
482 result[1] += local_value[12] * -1;
483 result[2] += local_value[12] * 1;
485 result[0] += local_value[13] * -1;
486 result[2] += local_value[13] * 1;
488 result[0] += local_value[14] * 1;
489 result[2] += local_value[14] * 1;
491 result[1] += local_value[15] * 1;
492 result[2] += local_value[15] * -1;
494 result[1] += local_value[16] * -1;
495 result[2] += local_value[16] * -1;
497 result[0] += local_value[17] * -1;
498 result[2] += local_value[17] * -1;
500 result[0] += local_value[18] * 1;
501 result[2] += local_value[18] * -1;
503 result[0] += local_value[19] * 1;
504 result[1] += local_value[19] * 1;
505 result[2] += local_value[19] * 1;
507 result[0] += local_value[20] * -1;
508 result[1] += local_value[20] * 1;
509 result[2] += local_value[20] * 1;
511 result[0] += local_value[21] * 1;
512 result[1] += local_value[21] * -1;
513 result[2] += local_value[21] * 1;
515 result[0] += local_value[22] * -1;
516 result[1] += local_value[22] * -1;
517 result[2] += local_value[22] * 1;
519 result[0] += local_value[23] * 1;
520 result[1] += local_value[23] * 1;
521 result[2] += local_value[23] * -1;
523 result[0] += local_value[24] * -1;
524 result[1] += local_value[24] * 1;
525 result[2] += local_value[24] * -1;
527 result[0] += local_value[25] * 1;
528 result[1] += local_value[25] * -1;
529 result[2] += local_value[25] * -1;
531 result[0] += local_value[26] * -1;
532 result[1] += local_value[26] * -1;
533 result[2] += local_value[26] * -1;
535 out.emplace_back(result[0u]);
536 out.emplace_back(result[1u]);
537 out.emplace_back(result[2u]);