278 IBlock *
block, ConstBlockDataID flagFieldID,
279 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
286 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
288 if (!(flagField->flagExists(boundaryFlagUID) and
289 flagField->flagExists(domainFlagUID)))
292 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
293 auto domainFlag = flagField->getFlag(domainFlagUID);
295 auto inner = flagField->xyzSize();
296 inner.expand(cell_idx_t(-1));
298 indexVectorAll.clear();
299 indexVectorInner.clear();
300 indexVectorOuter.clear();
302 for (
auto it = flagField->beginWithGhostLayerXYZ(
303 cell_idx_c(flagField->nrOfGhostLayers() - 1));
304 it != flagField->end(); ++it) {
305 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
308 if (isFlagSet(it.neighbor(0, 0, 0, 0), boundaryFlag)) {
309 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
310 auto const InitialisationAdditionalData = elementInitialiser(
311 Cell(it.x() + 0, it.y() + 0, it.z() + 0), blocks, *
block);
312 element.vel_0 = InitialisationAdditionalData[0];
313 element.vel_1 = InitialisationAdditionalData[1];
314 element.vel_2 = InitialisationAdditionalData[2];
315 indexVectorAll.emplace_back(element);
316 if (
inner.contains(it.x(), it.y(), it.z()))
317 indexVectorInner.emplace_back(element);
319 indexVectorOuter.emplace_back(element);
323 for (
auto it = flagField->beginWithGhostLayerXYZ(
324 cell_idx_c(flagField->nrOfGhostLayers() - 1));
325 it != flagField->end(); ++it) {
326 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
329 if (isFlagSet(it.neighbor(0, 1, 0, 0), boundaryFlag)) {
330 auto element =
IndexInfo(it.x(), it.y(), it.z(), 1);
331 auto const InitialisationAdditionalData = elementInitialiser(
332 Cell(it.x() + 0, it.y() + 1, it.z() + 0), blocks, *
block);
333 element.vel_0 = InitialisationAdditionalData[0];
334 element.vel_1 = InitialisationAdditionalData[1];
335 element.vel_2 = InitialisationAdditionalData[2];
336 indexVectorAll.emplace_back(element);
337 if (
inner.contains(it.x(), it.y(), it.z()))
338 indexVectorInner.emplace_back(element);
340 indexVectorOuter.emplace_back(element);
344 for (
auto it = flagField->beginWithGhostLayerXYZ(
345 cell_idx_c(flagField->nrOfGhostLayers() - 1));
346 it != flagField->end(); ++it) {
347 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
350 if (isFlagSet(it.neighbor(0, -1, 0, 0), boundaryFlag)) {
351 auto element =
IndexInfo(it.x(), it.y(), it.z(), 2);
352 auto const InitialisationAdditionalData = elementInitialiser(
353 Cell(it.x() + 0, it.y() - 1, it.z() + 0), blocks, *
block);
354 element.vel_0 = InitialisationAdditionalData[0];
355 element.vel_1 = InitialisationAdditionalData[1];
356 element.vel_2 = InitialisationAdditionalData[2];
357 indexVectorAll.emplace_back(element);
358 if (
inner.contains(it.x(), it.y(), it.z()))
359 indexVectorInner.emplace_back(element);
361 indexVectorOuter.emplace_back(element);
365 for (
auto it = flagField->beginWithGhostLayerXYZ(
366 cell_idx_c(flagField->nrOfGhostLayers() - 1));
367 it != flagField->end(); ++it) {
368 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
371 if (isFlagSet(it.neighbor(-1, 0, 0, 0), boundaryFlag)) {
372 auto element =
IndexInfo(it.x(), it.y(), it.z(), 3);
373 auto const InitialisationAdditionalData = elementInitialiser(
374 Cell(it.x() - 1, it.y() + 0, it.z() + 0), blocks, *
block);
375 element.vel_0 = InitialisationAdditionalData[0];
376 element.vel_1 = InitialisationAdditionalData[1];
377 element.vel_2 = InitialisationAdditionalData[2];
378 indexVectorAll.emplace_back(element);
379 if (
inner.contains(it.x(), it.y(), it.z()))
380 indexVectorInner.emplace_back(element);
382 indexVectorOuter.emplace_back(element);
386 for (
auto it = flagField->beginWithGhostLayerXYZ(
387 cell_idx_c(flagField->nrOfGhostLayers() - 1));
388 it != flagField->end(); ++it) {
389 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
392 if (isFlagSet(it.neighbor(1, 0, 0, 0), boundaryFlag)) {
393 auto element =
IndexInfo(it.x(), it.y(), it.z(), 4);
394 auto const InitialisationAdditionalData = elementInitialiser(
395 Cell(it.x() + 1, it.y() + 0, it.z() + 0), blocks, *
block);
396 element.vel_0 = InitialisationAdditionalData[0];
397 element.vel_1 = InitialisationAdditionalData[1];
398 element.vel_2 = InitialisationAdditionalData[2];
399 indexVectorAll.emplace_back(element);
400 if (
inner.contains(it.x(), it.y(), it.z()))
401 indexVectorInner.emplace_back(element);
403 indexVectorOuter.emplace_back(element);
407 for (
auto it = flagField->beginWithGhostLayerXYZ(
408 cell_idx_c(flagField->nrOfGhostLayers() - 1));
409 it != flagField->end(); ++it) {
410 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
413 if (isFlagSet(it.neighbor(0, 0, 1, 0), boundaryFlag)) {
414 auto element =
IndexInfo(it.x(), it.y(), it.z(), 5);
415 auto const InitialisationAdditionalData = elementInitialiser(
416 Cell(it.x() + 0, it.y() + 0, it.z() + 1), blocks, *
block);
417 element.vel_0 = InitialisationAdditionalData[0];
418 element.vel_1 = InitialisationAdditionalData[1];
419 element.vel_2 = InitialisationAdditionalData[2];
420 indexVectorAll.emplace_back(element);
421 if (
inner.contains(it.x(), it.y(), it.z()))
422 indexVectorInner.emplace_back(element);
424 indexVectorOuter.emplace_back(element);
428 for (
auto it = flagField->beginWithGhostLayerXYZ(
429 cell_idx_c(flagField->nrOfGhostLayers() - 1));
430 it != flagField->end(); ++it) {
431 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
434 if (isFlagSet(it.neighbor(0, 0, -1, 0), boundaryFlag)) {
435 auto element =
IndexInfo(it.x(), it.y(), it.z(), 6);
436 auto const InitialisationAdditionalData = elementInitialiser(
437 Cell(it.x() + 0, it.y() + 0, it.z() - 1), blocks, *
block);
438 element.vel_0 = InitialisationAdditionalData[0];
439 element.vel_1 = InitialisationAdditionalData[1];
440 element.vel_2 = InitialisationAdditionalData[2];
441 indexVectorAll.emplace_back(element);
442 if (
inner.contains(it.x(), it.y(), it.z()))
443 indexVectorInner.emplace_back(element);
445 indexVectorOuter.emplace_back(element);
449 for (
auto it = flagField->beginWithGhostLayerXYZ(
450 cell_idx_c(flagField->nrOfGhostLayers() - 1));
451 it != flagField->end(); ++it) {
452 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
455 if (isFlagSet(it.neighbor(-1, 1, 0, 0), boundaryFlag)) {
456 auto element =
IndexInfo(it.x(), it.y(), it.z(), 7);
457 auto const InitialisationAdditionalData = elementInitialiser(
458 Cell(it.x() - 1, it.y() + 1, it.z() + 0), blocks, *
block);
459 element.vel_0 = InitialisationAdditionalData[0];
460 element.vel_1 = InitialisationAdditionalData[1];
461 element.vel_2 = InitialisationAdditionalData[2];
462 indexVectorAll.emplace_back(element);
463 if (
inner.contains(it.x(), it.y(), it.z()))
464 indexVectorInner.emplace_back(element);
466 indexVectorOuter.emplace_back(element);
470 for (
auto it = flagField->beginWithGhostLayerXYZ(
471 cell_idx_c(flagField->nrOfGhostLayers() - 1));
472 it != flagField->end(); ++it) {
473 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
476 if (isFlagSet(it.neighbor(1, 1, 0, 0), boundaryFlag)) {
477 auto element =
IndexInfo(it.x(), it.y(), it.z(), 8);
478 auto const InitialisationAdditionalData = elementInitialiser(
479 Cell(it.x() + 1, it.y() + 1, it.z() + 0), blocks, *
block);
480 element.vel_0 = InitialisationAdditionalData[0];
481 element.vel_1 = InitialisationAdditionalData[1];
482 element.vel_2 = InitialisationAdditionalData[2];
483 indexVectorAll.emplace_back(element);
484 if (
inner.contains(it.x(), it.y(), it.z()))
485 indexVectorInner.emplace_back(element);
487 indexVectorOuter.emplace_back(element);
491 for (
auto it = flagField->beginWithGhostLayerXYZ(
492 cell_idx_c(flagField->nrOfGhostLayers() - 1));
493 it != flagField->end(); ++it) {
494 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
497 if (isFlagSet(it.neighbor(-1, -1, 0, 0), boundaryFlag)) {
498 auto element =
IndexInfo(it.x(), it.y(), it.z(), 9);
499 auto const InitialisationAdditionalData = elementInitialiser(
500 Cell(it.x() - 1, it.y() - 1, it.z() + 0), blocks, *
block);
501 element.vel_0 = InitialisationAdditionalData[0];
502 element.vel_1 = InitialisationAdditionalData[1];
503 element.vel_2 = InitialisationAdditionalData[2];
504 indexVectorAll.emplace_back(element);
505 if (
inner.contains(it.x(), it.y(), it.z()))
506 indexVectorInner.emplace_back(element);
508 indexVectorOuter.emplace_back(element);
512 for (
auto it = flagField->beginWithGhostLayerXYZ(
513 cell_idx_c(flagField->nrOfGhostLayers() - 1));
514 it != flagField->end(); ++it) {
515 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
518 if (isFlagSet(it.neighbor(1, -1, 0, 0), boundaryFlag)) {
519 auto element =
IndexInfo(it.x(), it.y(), it.z(), 10);
520 auto const InitialisationAdditionalData = elementInitialiser(
521 Cell(it.x() + 1, it.y() - 1, it.z() + 0), blocks, *
block);
522 element.vel_0 = InitialisationAdditionalData[0];
523 element.vel_1 = InitialisationAdditionalData[1];
524 element.vel_2 = InitialisationAdditionalData[2];
525 indexVectorAll.emplace_back(element);
526 if (
inner.contains(it.x(), it.y(), it.z()))
527 indexVectorInner.emplace_back(element);
529 indexVectorOuter.emplace_back(element);
533 for (
auto it = flagField->beginWithGhostLayerXYZ(
534 cell_idx_c(flagField->nrOfGhostLayers() - 1));
535 it != flagField->end(); ++it) {
536 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
539 if (isFlagSet(it.neighbor(0, 1, 1, 0), boundaryFlag)) {
540 auto element =
IndexInfo(it.x(), it.y(), it.z(), 11);
541 auto const InitialisationAdditionalData = elementInitialiser(
542 Cell(it.x() + 0, it.y() + 1, it.z() + 1), blocks, *
block);
543 element.vel_0 = InitialisationAdditionalData[0];
544 element.vel_1 = InitialisationAdditionalData[1];
545 element.vel_2 = InitialisationAdditionalData[2];
546 indexVectorAll.emplace_back(element);
547 if (
inner.contains(it.x(), it.y(), it.z()))
548 indexVectorInner.emplace_back(element);
550 indexVectorOuter.emplace_back(element);
554 for (
auto it = flagField->beginWithGhostLayerXYZ(
555 cell_idx_c(flagField->nrOfGhostLayers() - 1));
556 it != flagField->end(); ++it) {
557 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
560 if (isFlagSet(it.neighbor(0, -1, 1, 0), boundaryFlag)) {
561 auto element =
IndexInfo(it.x(), it.y(), it.z(), 12);
562 auto const InitialisationAdditionalData = elementInitialiser(
563 Cell(it.x() + 0, it.y() - 1, it.z() + 1), blocks, *
block);
564 element.vel_0 = InitialisationAdditionalData[0];
565 element.vel_1 = InitialisationAdditionalData[1];
566 element.vel_2 = InitialisationAdditionalData[2];
567 indexVectorAll.emplace_back(element);
568 if (
inner.contains(it.x(), it.y(), it.z()))
569 indexVectorInner.emplace_back(element);
571 indexVectorOuter.emplace_back(element);
575 for (
auto it = flagField->beginWithGhostLayerXYZ(
576 cell_idx_c(flagField->nrOfGhostLayers() - 1));
577 it != flagField->end(); ++it) {
578 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
581 if (isFlagSet(it.neighbor(-1, 0, 1, 0), boundaryFlag)) {
582 auto element =
IndexInfo(it.x(), it.y(), it.z(), 13);
583 auto const InitialisationAdditionalData = elementInitialiser(
584 Cell(it.x() - 1, it.y() + 0, it.z() + 1), blocks, *
block);
585 element.vel_0 = InitialisationAdditionalData[0];
586 element.vel_1 = InitialisationAdditionalData[1];
587 element.vel_2 = InitialisationAdditionalData[2];
588 indexVectorAll.emplace_back(element);
589 if (
inner.contains(it.x(), it.y(), it.z()))
590 indexVectorInner.emplace_back(element);
592 indexVectorOuter.emplace_back(element);
596 for (
auto it = flagField->beginWithGhostLayerXYZ(
597 cell_idx_c(flagField->nrOfGhostLayers() - 1));
598 it != flagField->end(); ++it) {
599 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
602 if (isFlagSet(it.neighbor(1, 0, 1, 0), boundaryFlag)) {
603 auto element =
IndexInfo(it.x(), it.y(), it.z(), 14);
604 auto const InitialisationAdditionalData = elementInitialiser(
605 Cell(it.x() + 1, it.y() + 0, it.z() + 1), blocks, *
block);
606 element.vel_0 = InitialisationAdditionalData[0];
607 element.vel_1 = InitialisationAdditionalData[1];
608 element.vel_2 = InitialisationAdditionalData[2];
609 indexVectorAll.emplace_back(element);
610 if (
inner.contains(it.x(), it.y(), it.z()))
611 indexVectorInner.emplace_back(element);
613 indexVectorOuter.emplace_back(element);
617 for (
auto it = flagField->beginWithGhostLayerXYZ(
618 cell_idx_c(flagField->nrOfGhostLayers() - 1));
619 it != flagField->end(); ++it) {
620 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
623 if (isFlagSet(it.neighbor(0, 1, -1, 0), boundaryFlag)) {
624 auto element =
IndexInfo(it.x(), it.y(), it.z(), 15);
625 auto const InitialisationAdditionalData = elementInitialiser(
626 Cell(it.x() + 0, it.y() + 1, it.z() - 1), blocks, *
block);
627 element.vel_0 = InitialisationAdditionalData[0];
628 element.vel_1 = InitialisationAdditionalData[1];
629 element.vel_2 = InitialisationAdditionalData[2];
630 indexVectorAll.emplace_back(element);
631 if (
inner.contains(it.x(), it.y(), it.z()))
632 indexVectorInner.emplace_back(element);
634 indexVectorOuter.emplace_back(element);
638 for (
auto it = flagField->beginWithGhostLayerXYZ(
639 cell_idx_c(flagField->nrOfGhostLayers() - 1));
640 it != flagField->end(); ++it) {
641 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
644 if (isFlagSet(it.neighbor(0, -1, -1, 0), boundaryFlag)) {
645 auto element =
IndexInfo(it.x(), it.y(), it.z(), 16);
646 auto const InitialisationAdditionalData = elementInitialiser(
647 Cell(it.x() + 0, it.y() - 1, it.z() - 1), blocks, *
block);
648 element.vel_0 = InitialisationAdditionalData[0];
649 element.vel_1 = InitialisationAdditionalData[1];
650 element.vel_2 = InitialisationAdditionalData[2];
651 indexVectorAll.emplace_back(element);
652 if (
inner.contains(it.x(), it.y(), it.z()))
653 indexVectorInner.emplace_back(element);
655 indexVectorOuter.emplace_back(element);
659 for (
auto it = flagField->beginWithGhostLayerXYZ(
660 cell_idx_c(flagField->nrOfGhostLayers() - 1));
661 it != flagField->end(); ++it) {
662 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
665 if (isFlagSet(it.neighbor(-1, 0, -1, 0), boundaryFlag)) {
666 auto element =
IndexInfo(it.x(), it.y(), it.z(), 17);
667 auto const InitialisationAdditionalData = elementInitialiser(
668 Cell(it.x() - 1, it.y() + 0, it.z() - 1), blocks, *
block);
669 element.vel_0 = InitialisationAdditionalData[0];
670 element.vel_1 = InitialisationAdditionalData[1];
671 element.vel_2 = InitialisationAdditionalData[2];
672 indexVectorAll.emplace_back(element);
673 if (
inner.contains(it.x(), it.y(), it.z()))
674 indexVectorInner.emplace_back(element);
676 indexVectorOuter.emplace_back(element);
680 for (
auto it = flagField->beginWithGhostLayerXYZ(
681 cell_idx_c(flagField->nrOfGhostLayers() - 1));
682 it != flagField->end(); ++it) {
683 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
686 if (isFlagSet(it.neighbor(1, 0, -1, 0), boundaryFlag)) {
687 auto element =
IndexInfo(it.x(), it.y(), it.z(), 18);
688 auto const InitialisationAdditionalData = elementInitialiser(
689 Cell(it.x() + 1, it.y() + 0, it.z() - 1), blocks, *
block);
690 element.vel_0 = InitialisationAdditionalData[0];
691 element.vel_1 = InitialisationAdditionalData[1];
692 element.vel_2 = InitialisationAdditionalData[2];
693 indexVectorAll.emplace_back(element);
694 if (
inner.contains(it.x(), it.y(), it.z()))
695 indexVectorInner.emplace_back(element);
697 indexVectorOuter.emplace_back(element);
702 forceVector->forceVector().resize(indexVectorAll.size());
703 forceVector->syncGPU();