217 IBlock *
block, ConstBlockDataID flagFieldID,
218 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
225 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
227 if (!(flagField->flagExists(boundaryFlagUID) and
228 flagField->flagExists(domainFlagUID)))
231 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
232 auto domainFlag = flagField->getFlag(domainFlagUID);
234 auto inner = flagField->xyzSize();
235 inner.expand(cell_idx_t(-1));
237 indexVectorAll.clear();
238 indexVectorInner.clear();
239 indexVectorOuter.clear();
241 for (
auto it = flagField->beginWithGhostLayerXYZ(
242 cell_idx_c(flagField->nrOfGhostLayers() - 1));
243 it != flagField->end(); ++it) {
244 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
247 if (isFlagSet(it.neighbor(0, 0, 0, 0), boundaryFlag)) {
248 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
249 auto const InitialisationAdditionalData = elementInitialiser(
250 Cell(it.x() + 0, it.y() + 0, it.z() + 0), blocks, *
block);
251 element.vel_0 = InitialisationAdditionalData[0];
252 element.vel_1 = InitialisationAdditionalData[1];
253 element.vel_2 = InitialisationAdditionalData[2];
254 indexVectorAll.emplace_back(element);
255 if (
inner.contains(it.x(), it.y(), it.z()))
256 indexVectorInner.emplace_back(element);
258 indexVectorOuter.emplace_back(element);
262 for (
auto it = flagField->beginWithGhostLayerXYZ(
263 cell_idx_c(flagField->nrOfGhostLayers() - 1));
264 it != flagField->end(); ++it) {
265 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
268 if (isFlagSet(it.neighbor(0, 1, 0, 0), boundaryFlag)) {
269 auto element =
IndexInfo(it.x(), it.y(), it.z(), 1);
270 auto const InitialisationAdditionalData = elementInitialiser(
271 Cell(it.x() + 0, it.y() + 1, it.z() + 0), blocks, *
block);
272 element.vel_0 = InitialisationAdditionalData[0];
273 element.vel_1 = InitialisationAdditionalData[1];
274 element.vel_2 = InitialisationAdditionalData[2];
275 indexVectorAll.emplace_back(element);
276 if (
inner.contains(it.x(), it.y(), it.z()))
277 indexVectorInner.emplace_back(element);
279 indexVectorOuter.emplace_back(element);
283 for (
auto it = flagField->beginWithGhostLayerXYZ(
284 cell_idx_c(flagField->nrOfGhostLayers() - 1));
285 it != flagField->end(); ++it) {
286 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
289 if (isFlagSet(it.neighbor(0, -1, 0, 0), boundaryFlag)) {
290 auto element =
IndexInfo(it.x(), it.y(), it.z(), 2);
291 auto const InitialisationAdditionalData = elementInitialiser(
292 Cell(it.x() + 0, it.y() - 1, it.z() + 0), blocks, *
block);
293 element.vel_0 = InitialisationAdditionalData[0];
294 element.vel_1 = InitialisationAdditionalData[1];
295 element.vel_2 = InitialisationAdditionalData[2];
296 indexVectorAll.emplace_back(element);
297 if (
inner.contains(it.x(), it.y(), it.z()))
298 indexVectorInner.emplace_back(element);
300 indexVectorOuter.emplace_back(element);
304 for (
auto it = flagField->beginWithGhostLayerXYZ(
305 cell_idx_c(flagField->nrOfGhostLayers() - 1));
306 it != flagField->end(); ++it) {
307 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
310 if (isFlagSet(it.neighbor(-1, 0, 0, 0), boundaryFlag)) {
311 auto element =
IndexInfo(it.x(), it.y(), it.z(), 3);
312 auto const InitialisationAdditionalData = elementInitialiser(
313 Cell(it.x() - 1, it.y() + 0, it.z() + 0), blocks, *
block);
314 element.vel_0 = InitialisationAdditionalData[0];
315 element.vel_1 = InitialisationAdditionalData[1];
316 element.vel_2 = InitialisationAdditionalData[2];
317 indexVectorAll.emplace_back(element);
318 if (
inner.contains(it.x(), it.y(), it.z()))
319 indexVectorInner.emplace_back(element);
321 indexVectorOuter.emplace_back(element);
325 for (
auto it = flagField->beginWithGhostLayerXYZ(
326 cell_idx_c(flagField->nrOfGhostLayers() - 1));
327 it != flagField->end(); ++it) {
328 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
331 if (isFlagSet(it.neighbor(1, 0, 0, 0), boundaryFlag)) {
332 auto element =
IndexInfo(it.x(), it.y(), it.z(), 4);
333 auto const InitialisationAdditionalData = elementInitialiser(
334 Cell(it.x() + 1, it.y() + 0, it.z() + 0), blocks, *
block);
335 element.vel_0 = InitialisationAdditionalData[0];
336 element.vel_1 = InitialisationAdditionalData[1];
337 element.vel_2 = InitialisationAdditionalData[2];
338 indexVectorAll.emplace_back(element);
339 if (
inner.contains(it.x(), it.y(), it.z()))
340 indexVectorInner.emplace_back(element);
342 indexVectorOuter.emplace_back(element);
346 for (
auto it = flagField->beginWithGhostLayerXYZ(
347 cell_idx_c(flagField->nrOfGhostLayers() - 1));
348 it != flagField->end(); ++it) {
349 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
352 if (isFlagSet(it.neighbor(0, 0, 1, 0), boundaryFlag)) {
353 auto element =
IndexInfo(it.x(), it.y(), it.z(), 5);
354 auto const InitialisationAdditionalData = elementInitialiser(
355 Cell(it.x() + 0, it.y() + 0, it.z() + 1), blocks, *
block);
356 element.vel_0 = InitialisationAdditionalData[0];
357 element.vel_1 = InitialisationAdditionalData[1];
358 element.vel_2 = InitialisationAdditionalData[2];
359 indexVectorAll.emplace_back(element);
360 if (
inner.contains(it.x(), it.y(), it.z()))
361 indexVectorInner.emplace_back(element);
363 indexVectorOuter.emplace_back(element);
367 for (
auto it = flagField->beginWithGhostLayerXYZ(
368 cell_idx_c(flagField->nrOfGhostLayers() - 1));
369 it != flagField->end(); ++it) {
370 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
373 if (isFlagSet(it.neighbor(0, 0, -1, 0), boundaryFlag)) {
374 auto element =
IndexInfo(it.x(), it.y(), it.z(), 6);
375 auto const InitialisationAdditionalData = elementInitialiser(
376 Cell(it.x() + 0, it.y() + 0, it.z() - 1), blocks, *
block);
377 element.vel_0 = InitialisationAdditionalData[0];
378 element.vel_1 = InitialisationAdditionalData[1];
379 element.vel_2 = InitialisationAdditionalData[2];
380 indexVectorAll.emplace_back(element);
381 if (
inner.contains(it.x(), it.y(), it.z()))
382 indexVectorInner.emplace_back(element);
384 indexVectorOuter.emplace_back(element);
388 for (
auto it = flagField->beginWithGhostLayerXYZ(
389 cell_idx_c(flagField->nrOfGhostLayers() - 1));
390 it != flagField->end(); ++it) {
391 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
394 if (isFlagSet(it.neighbor(-1, 1, 0, 0), boundaryFlag)) {
395 auto element =
IndexInfo(it.x(), it.y(), it.z(), 7);
396 auto const InitialisationAdditionalData = elementInitialiser(
397 Cell(it.x() - 1, it.y() + 1, it.z() + 0), blocks, *
block);
398 element.vel_0 = InitialisationAdditionalData[0];
399 element.vel_1 = InitialisationAdditionalData[1];
400 element.vel_2 = InitialisationAdditionalData[2];
401 indexVectorAll.emplace_back(element);
402 if (
inner.contains(it.x(), it.y(), it.z()))
403 indexVectorInner.emplace_back(element);
405 indexVectorOuter.emplace_back(element);
409 for (
auto it = flagField->beginWithGhostLayerXYZ(
410 cell_idx_c(flagField->nrOfGhostLayers() - 1));
411 it != flagField->end(); ++it) {
412 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
415 if (isFlagSet(it.neighbor(1, 1, 0, 0), boundaryFlag)) {
416 auto element =
IndexInfo(it.x(), it.y(), it.z(), 8);
417 auto const InitialisationAdditionalData = elementInitialiser(
418 Cell(it.x() + 1, it.y() + 1, it.z() + 0), blocks, *
block);
419 element.vel_0 = InitialisationAdditionalData[0];
420 element.vel_1 = InitialisationAdditionalData[1];
421 element.vel_2 = InitialisationAdditionalData[2];
422 indexVectorAll.emplace_back(element);
423 if (
inner.contains(it.x(), it.y(), it.z()))
424 indexVectorInner.emplace_back(element);
426 indexVectorOuter.emplace_back(element);
430 for (
auto it = flagField->beginWithGhostLayerXYZ(
431 cell_idx_c(flagField->nrOfGhostLayers() - 1));
432 it != flagField->end(); ++it) {
433 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
436 if (isFlagSet(it.neighbor(-1, -1, 0, 0), boundaryFlag)) {
437 auto element =
IndexInfo(it.x(), it.y(), it.z(), 9);
438 auto const InitialisationAdditionalData = elementInitialiser(
439 Cell(it.x() - 1, it.y() - 1, it.z() + 0), blocks, *
block);
440 element.vel_0 = InitialisationAdditionalData[0];
441 element.vel_1 = InitialisationAdditionalData[1];
442 element.vel_2 = InitialisationAdditionalData[2];
443 indexVectorAll.emplace_back(element);
444 if (
inner.contains(it.x(), it.y(), it.z()))
445 indexVectorInner.emplace_back(element);
447 indexVectorOuter.emplace_back(element);
451 for (
auto it = flagField->beginWithGhostLayerXYZ(
452 cell_idx_c(flagField->nrOfGhostLayers() - 1));
453 it != flagField->end(); ++it) {
454 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
457 if (isFlagSet(it.neighbor(1, -1, 0, 0), boundaryFlag)) {
458 auto element =
IndexInfo(it.x(), it.y(), it.z(), 10);
459 auto const InitialisationAdditionalData = elementInitialiser(
460 Cell(it.x() + 1, it.y() - 1, it.z() + 0), blocks, *
block);
461 element.vel_0 = InitialisationAdditionalData[0];
462 element.vel_1 = InitialisationAdditionalData[1];
463 element.vel_2 = InitialisationAdditionalData[2];
464 indexVectorAll.emplace_back(element);
465 if (
inner.contains(it.x(), it.y(), it.z()))
466 indexVectorInner.emplace_back(element);
468 indexVectorOuter.emplace_back(element);
472 for (
auto it = flagField->beginWithGhostLayerXYZ(
473 cell_idx_c(flagField->nrOfGhostLayers() - 1));
474 it != flagField->end(); ++it) {
475 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
478 if (isFlagSet(it.neighbor(0, 1, 1, 0), boundaryFlag)) {
479 auto element =
IndexInfo(it.x(), it.y(), it.z(), 11);
480 auto const InitialisationAdditionalData = elementInitialiser(
481 Cell(it.x() + 0, it.y() + 1, it.z() + 1), blocks, *
block);
482 element.vel_0 = InitialisationAdditionalData[0];
483 element.vel_1 = InitialisationAdditionalData[1];
484 element.vel_2 = InitialisationAdditionalData[2];
485 indexVectorAll.emplace_back(element);
486 if (
inner.contains(it.x(), it.y(), it.z()))
487 indexVectorInner.emplace_back(element);
489 indexVectorOuter.emplace_back(element);
493 for (
auto it = flagField->beginWithGhostLayerXYZ(
494 cell_idx_c(flagField->nrOfGhostLayers() - 1));
495 it != flagField->end(); ++it) {
496 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
499 if (isFlagSet(it.neighbor(0, -1, 1, 0), boundaryFlag)) {
500 auto element =
IndexInfo(it.x(), it.y(), it.z(), 12);
501 auto const InitialisationAdditionalData = elementInitialiser(
502 Cell(it.x() + 0, it.y() - 1, it.z() + 1), blocks, *
block);
503 element.vel_0 = InitialisationAdditionalData[0];
504 element.vel_1 = InitialisationAdditionalData[1];
505 element.vel_2 = InitialisationAdditionalData[2];
506 indexVectorAll.emplace_back(element);
507 if (
inner.contains(it.x(), it.y(), it.z()))
508 indexVectorInner.emplace_back(element);
510 indexVectorOuter.emplace_back(element);
514 for (
auto it = flagField->beginWithGhostLayerXYZ(
515 cell_idx_c(flagField->nrOfGhostLayers() - 1));
516 it != flagField->end(); ++it) {
517 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
520 if (isFlagSet(it.neighbor(-1, 0, 1, 0), boundaryFlag)) {
521 auto element =
IndexInfo(it.x(), it.y(), it.z(), 13);
522 auto const InitialisationAdditionalData = elementInitialiser(
523 Cell(it.x() - 1, it.y() + 0, it.z() + 1), blocks, *
block);
524 element.vel_0 = InitialisationAdditionalData[0];
525 element.vel_1 = InitialisationAdditionalData[1];
526 element.vel_2 = InitialisationAdditionalData[2];
527 indexVectorAll.emplace_back(element);
528 if (
inner.contains(it.x(), it.y(), it.z()))
529 indexVectorInner.emplace_back(element);
531 indexVectorOuter.emplace_back(element);
535 for (
auto it = flagField->beginWithGhostLayerXYZ(
536 cell_idx_c(flagField->nrOfGhostLayers() - 1));
537 it != flagField->end(); ++it) {
538 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
541 if (isFlagSet(it.neighbor(1, 0, 1, 0), boundaryFlag)) {
542 auto element =
IndexInfo(it.x(), it.y(), it.z(), 14);
543 auto const InitialisationAdditionalData = elementInitialiser(
544 Cell(it.x() + 1, it.y() + 0, it.z() + 1), blocks, *
block);
545 element.vel_0 = InitialisationAdditionalData[0];
546 element.vel_1 = InitialisationAdditionalData[1];
547 element.vel_2 = InitialisationAdditionalData[2];
548 indexVectorAll.emplace_back(element);
549 if (
inner.contains(it.x(), it.y(), it.z()))
550 indexVectorInner.emplace_back(element);
552 indexVectorOuter.emplace_back(element);
556 for (
auto it = flagField->beginWithGhostLayerXYZ(
557 cell_idx_c(flagField->nrOfGhostLayers() - 1));
558 it != flagField->end(); ++it) {
559 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
562 if (isFlagSet(it.neighbor(0, 1, -1, 0), boundaryFlag)) {
563 auto element =
IndexInfo(it.x(), it.y(), it.z(), 15);
564 auto const InitialisationAdditionalData = elementInitialiser(
565 Cell(it.x() + 0, it.y() + 1, it.z() - 1), blocks, *
block);
566 element.vel_0 = InitialisationAdditionalData[0];
567 element.vel_1 = InitialisationAdditionalData[1];
568 element.vel_2 = InitialisationAdditionalData[2];
569 indexVectorAll.emplace_back(element);
570 if (
inner.contains(it.x(), it.y(), it.z()))
571 indexVectorInner.emplace_back(element);
573 indexVectorOuter.emplace_back(element);
577 for (
auto it = flagField->beginWithGhostLayerXYZ(
578 cell_idx_c(flagField->nrOfGhostLayers() - 1));
579 it != flagField->end(); ++it) {
580 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
583 if (isFlagSet(it.neighbor(0, -1, -1, 0), boundaryFlag)) {
584 auto element =
IndexInfo(it.x(), it.y(), it.z(), 16);
585 auto const InitialisationAdditionalData = elementInitialiser(
586 Cell(it.x() + 0, it.y() - 1, it.z() - 1), blocks, *
block);
587 element.vel_0 = InitialisationAdditionalData[0];
588 element.vel_1 = InitialisationAdditionalData[1];
589 element.vel_2 = InitialisationAdditionalData[2];
590 indexVectorAll.emplace_back(element);
591 if (
inner.contains(it.x(), it.y(), it.z()))
592 indexVectorInner.emplace_back(element);
594 indexVectorOuter.emplace_back(element);
598 for (
auto it = flagField->beginWithGhostLayerXYZ(
599 cell_idx_c(flagField->nrOfGhostLayers() - 1));
600 it != flagField->end(); ++it) {
601 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
604 if (isFlagSet(it.neighbor(-1, 0, -1, 0), boundaryFlag)) {
605 auto element =
IndexInfo(it.x(), it.y(), it.z(), 17);
606 auto const InitialisationAdditionalData = elementInitialiser(
607 Cell(it.x() - 1, it.y() + 0, it.z() - 1), blocks, *
block);
608 element.vel_0 = InitialisationAdditionalData[0];
609 element.vel_1 = InitialisationAdditionalData[1];
610 element.vel_2 = InitialisationAdditionalData[2];
611 indexVectorAll.emplace_back(element);
612 if (
inner.contains(it.x(), it.y(), it.z()))
613 indexVectorInner.emplace_back(element);
615 indexVectorOuter.emplace_back(element);
619 for (
auto it = flagField->beginWithGhostLayerXYZ(
620 cell_idx_c(flagField->nrOfGhostLayers() - 1));
621 it != flagField->end(); ++it) {
622 if (!isFlagSet(it, domainFlag) || isFlagSet(it, boundaryFlag))
625 if (isFlagSet(it.neighbor(1, 0, -1, 0), boundaryFlag)) {
626 auto element =
IndexInfo(it.x(), it.y(), it.z(), 18);
627 auto const InitialisationAdditionalData = elementInitialiser(
628 Cell(it.x() + 1, it.y() + 0, it.z() - 1), blocks, *
block);
629 element.vel_0 = InitialisationAdditionalData[0];
630 element.vel_1 = InitialisationAdditionalData[1];
631 element.vel_2 = InitialisationAdditionalData[2];
632 indexVectorAll.emplace_back(element);
633 if (
inner.contains(it.x(), it.y(), it.z()))
634 indexVectorInner.emplace_back(element);
636 indexVectorOuter.emplace_back(element);
641 forceVector->forceVector().resize(indexVectorAll.size());
642 forceVector->syncGPU();