From e0e794de3621d01babcc9481403d6886f492320d Mon Sep 17 00:00:00 2001
From: kutscher <kutscher@irmb.tu-bs.de>
Date: Mon, 2 Aug 2021 19:07:59 +0200
Subject: [PATCH] add remote connector for for two phase fields velocity kernel

---
 .../cpu/MultiphaseDropletTest/DropletTest.cfg |   2 +-
 apps/cpu/MultiphaseDropletTest/droplet.cpp    |  12 +-
 ...ThreeDistributionsFullVectorConnector2.cpp | 544 +++++++++++++++++-
 .../ThreeDistributionsFullVectorConnector2.h  |   9 +
 .../Interactors/InteractorsHelper.cpp         |   2 +-
 .../Visitors/SetConnectorsBlockVisitor.h      |   3 +-
 6 files changed, 555 insertions(+), 17 deletions(-)

diff --git a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
index 8ab087bde..243e04299 100644
--- a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
+++ b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg
@@ -1,7 +1,7 @@
 #pathname = d:/temp/MultiphaseDropletTest
 pathname = E:/Multiphase/DropletTestSigma2
 
-numOfThreads = 4
+numOfThreads = 1
 availMem = 10e9
 
 #Grid
diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index 9764094fc..01660db88 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -151,16 +151,16 @@ void run(string configname)
             SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor(
                 grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm));
 
-            //SPtr<Grid3DVisitor> metisVisitor(
-            //    new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW));
-            //InteractorsHelper intHelper(grid, metisVisitor);
-            //intHelper.selectBlocks();
+            SPtr<Grid3DVisitor> metisVisitor(
+                new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE));
+            InteractorsHelper intHelper(grid, metisVisitor, true);
+            intHelper.selectBlocks();
 
             ppblocks->process(0);
             ppblocks.reset();
 
             unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks();
-            int ghostLayer                    = 3;
+            int ghostLayer                    = 5;
             unsigned long long numberOfNodesPerBlock =
                 (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]);
             unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock;
@@ -196,7 +196,7 @@ void run(string configname)
             }
 
 
-            //intHelper.setBC();
+            intHelper.setBC();
 
             //grid->accept(bcVisitor);
 
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
index a9e3c7e74..c8528b1e7 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
@@ -55,32 +55,33 @@ void ThreeDistributionsFullVectorConnector2::init()
    fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions());
    hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions());
    h2Dis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getH2distributions());
+   pressure   = block.lock()->getKernel()->getDataSet()->getPressureField();
 
-   int anz = 3*27;
+   int anz = 3*27+1;
    switch (sendDir)
    {
    case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
    case D3Q27System::E:
-   case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
+   case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz*2, 0.0);   break;
    case D3Q27System::N:
-   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
+   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz*2, 0.0);   break;
    case D3Q27System::T:
-   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
+   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz*2, 0.0);   break;
 
    case D3Q27System::NE:
    case D3Q27System::SW:
    case D3Q27System::SE:
-   case D3Q27System::NW:  sender->getData().resize(maxX3*anz, 0.0);   break;
+   case D3Q27System::NW:  sender->getData().resize(maxX3*anz*4, 0.0);   break;
 
    case D3Q27System::TE:
    case D3Q27System::BW:
    case D3Q27System::BE:
-   case D3Q27System::TW:  sender->getData().resize(maxX2*anz, 0.0);   break;
+   case D3Q27System::TW:  sender->getData().resize(maxX2*anz*4, 0.0);   break;
 
    case D3Q27System::TN:
    case D3Q27System::BS:
    case D3Q27System::BN:
-   case D3Q27System::TS:  sender->getData().resize(maxX1*anz, 0.0);   break;
+   case D3Q27System::TS:  sender->getData().resize(maxX1*anz*4, 0.0);   break;
 
    case D3Q27System::TNE:
    case D3Q27System::BSW:
@@ -89,11 +90,538 @@ void ThreeDistributionsFullVectorConnector2::init()
    case D3Q27System::TSE:
    case D3Q27System::BNW:
    case D3Q27System::BSE:
-   case D3Q27System::TNW:  sender->getData().resize(anz, 0.0);   break;
+   case D3Q27System::TNW:  sender->getData().resize(anz*8, 0.0);   break;
 
    default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
    }
 }
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsFullVectorConnector2::fillSendVectors() 
+{ 
+    updatePointers();
+    fillData();
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsFullVectorConnector2::fillData()
+{
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
 
+    vector_type &sdata = sender->getData();
+
+    int index = 0;
+    // EAST
+    if (sendDir == D3Q27System::E) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, maxX1m3, x2, x3);
+                fillData(sdata, index, maxX1m2, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::W) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                fillData(sdata, index, minX1p3, x2, x3);
+                fillData(sdata, index, minX1p2, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::N) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, maxX2m3, x3);
+                fillData(sdata, index, x1, maxX2m2, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::S) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, minX2p3, x3);
+                fillData(sdata, index, x1, minX2p2, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::T) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, maxX3m3);
+                fillData(sdata, index, x1, x2, maxX3m2);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::B) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                fillData(sdata, index, x1, x2, minX3p3);
+                fillData(sdata, index, x1, x2, minX3p2);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::NE) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, maxX2m3, x3);
+            fillData(sdata, index, maxX1m2, maxX2m2, x3);
+            fillData(sdata, index, maxX1m3, maxX2m2, x3);
+            fillData(sdata, index, maxX1m2, maxX2m3, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::NW) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, maxX2m3, x3);
+            fillData(sdata, index, minX1p2, maxX2m2, x3);
+            fillData(sdata, index, minX1p3, maxX2m2, x3);
+            fillData(sdata, index, minX1p2, maxX2m3, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::SW) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, minX1p3, minX2p3, x3);
+            fillData(sdata, index, minX1p2, minX2p2, x3);
+            fillData(sdata, index, minX1p3, minX2p2, x3);
+            fillData(sdata, index, minX1p2, minX2p3, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::SE) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            fillData(sdata, index, maxX1m3, minX2p3, x3);
+            fillData(sdata, index, maxX1m2, minX2p2, x3);
+            fillData(sdata, index, maxX1m3, minX2p2, x3);
+            fillData(sdata, index, maxX1m2, minX2p3, x3);
+        }
+    } else if (sendDir == D3Q27System::TE)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, maxX3m3);
+            fillData(sdata, index, maxX1m2, x2, maxX3m2);
+            fillData(sdata, index, maxX1m3, x2, maxX3m2);
+            fillData(sdata, index, maxX1m2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::BW)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, minX3p3);
+            fillData(sdata, index, minX1p2, x2, minX3p2);
+            fillData(sdata, index, minX1p3, x2, minX3p2);
+            fillData(sdata, index, minX1p2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::BE)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, maxX1m3, x2, minX3p3);
+            fillData(sdata, index, maxX1m2, x2, minX3p2);
+            fillData(sdata, index, maxX1m3, x2, minX3p2);
+            fillData(sdata, index, maxX1m2, x2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::TW)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            fillData(sdata, index, minX1p3, x2, maxX3m3);
+            fillData(sdata, index, minX1p2, x2, maxX3m2);
+            fillData(sdata, index, minX1p3, x2, maxX3m2);
+            fillData(sdata, index, minX1p2, x2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::TN)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, maxX3m3);
+            fillData(sdata, index, x1, maxX2m2, maxX3m2);
+            fillData(sdata, index, x1, maxX2m3, maxX3m2);
+            fillData(sdata, index, x1, maxX2m2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::BS)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, minX3p3);
+            fillData(sdata, index, x1, minX2p2, minX3p2);
+            fillData(sdata, index, x1, minX2p3, minX3p2);
+            fillData(sdata, index, x1, minX2p2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::BN)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, maxX2m3, minX3p3);
+            fillData(sdata, index, x1, maxX2m2, minX3p2);
+            fillData(sdata, index, x1, maxX2m3, minX3p2);
+            fillData(sdata, index, x1, maxX2m2, minX3p3);
+        }
+    else if (sendDir == D3Q27System::TS)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            fillData(sdata, index, x1, minX2p3, maxX3m3);
+            fillData(sdata, index, x1, minX2p2, maxX3m2);
+            fillData(sdata, index, x1, minX2p3, maxX3m2);
+            fillData(sdata, index, x1, minX2p2, maxX3m3);
+        }
+    else if (sendDir == D3Q27System::TSW) {
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p2, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p3, minX2p3, maxX3m2);
+        fillData(sdata, index, minX1p3, minX2p2, maxX3m3);
+        fillData(sdata, index, minX1p2, minX2p3, maxX3m3);
+    } else if (sendDir == D3Q27System::TSE) {
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m2, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m3, minX1p3, maxX3m2);
+        fillData(sdata, index, maxX1m3, minX1p2, maxX3m3);
+        fillData(sdata, index, maxX1m2, minX1p3, maxX3m3);
+    } else if (sendDir == D3Q27System::TNW) {
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p2, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p3, maxX2m3, maxX3m2);
+        fillData(sdata, index, minX1p3, maxX2m2, maxX3m3);
+        fillData(sdata, index, minX1p2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::TNE) {
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2);
+        fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3);
+        fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3);
+    } else if (sendDir == D3Q27System::BSW) {
+        fillData(sdata, index, minX1p3, minX2p3, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p2, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p3, minX2p3, minX3p2);
+        fillData(sdata, index, minX1p3, minX2p2, minX3p3);
+        fillData(sdata, index, minX1p2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::BSE) {
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m2, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m3, minX2p3, minX3p2);
+        fillData(sdata, index, maxX1m3, minX2p2, minX3p3);
+        fillData(sdata, index, maxX1m2, minX2p3, minX3p3);
+    } else if (sendDir == D3Q27System::BNW) {
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p2, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p3, maxX2m3, minX3p2);
+        fillData(sdata, index, minX1p3, maxX2m2, minX3p3);
+        fillData(sdata, index, minX1p2, maxX2m3, minX3p3);
+    } else if (sendDir == D3Q27System::BNE) {
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m2, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m3, maxX2m3, minX3p2);
+        fillData(sdata, index, maxX1m3, maxX2m2, minX3p3);
+        fillData(sdata, index, maxX1m2, maxX2m3, minX3p3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsFullVectorConnector2::distributeReceiveVectors() 
+{
+    updatePointers();
+    distributeData();
+}
+////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsFullVectorConnector2::distributeData()
+{
+    vector_type &rdata = receiver->getData();
+
+    int index = 0;
+    ////////////////////////////////////////////////////////////
+    // relation between ghost layer and regular nodes
+    // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes
+    // minX1   minX1p1 ... maxX1m1 maxX1   - ghost layer
+    ////////////////////////////////////////////////////////////
+
+    int minX1   = 0;
+    int minX1p1 = minX1 + 1;
+    int minX1p2 = minX1 + 2;
+    int minX1p3 = minX1 + 3;
+    int maxX1m1 = maxX1 - 1;
+    int maxX1m2 = maxX1 - 2;
+    int maxX1m3 = maxX1 - 3;
+
+    int minX2   = 0;
+    int minX2p1 = minX2 + 1;
+    int minX2p2 = minX2 + 2;
+    int minX2p3 = minX2 + 3;
+    int maxX2m1 = maxX2 - 1;
+    int maxX2m2 = maxX2 - 2;
+    int maxX2m3 = maxX2 - 3;
+
+    int minX3   = 0;
+    int minX3p1 = minX3 + 1;
+    int minX3p2 = minX3 + 2;
+    int minX3p3 = minX3 + 3;
+    int maxX3m1 = maxX3 - 1;
+    int maxX3m2 = maxX3 - 2;
+    int maxX3m3 = maxX3 - 3;
+
+    // EAST
+    if (sendDir == D3Q27System::W) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, minX1, x2, x3);
+                distributeData(rdata, index, minX1p1, x2, x3);
+            }
+        }
+    }
+    // WEST
+    else if (sendDir == D3Q27System::E) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+                distributeData(rdata, index, maxX1, x2, x3);
+                distributeData(rdata, index, maxX1m1, x2, x3);
+            }
+        }
+    }
+    // NORTH
+    else if (sendDir == D3Q27System::S) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, minX2, x3);
+                distributeData(rdata, index, x1, minX2p1, x3);
+            }
+        }
+    }
+    // SOUTH
+    else if (sendDir == D3Q27System::N) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, maxX2, x3);
+                distributeData(rdata, index, x1, maxX2m1, x3);
+            }
+        }
+    }
+
+    // TOP
+    else if (sendDir == D3Q27System::B) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, minX3);
+                distributeData(rdata, index, x1, x2, minX3p1);
+            }
+        }
+    }
+    // BOTTOM
+    else if (sendDir == D3Q27System::T) {
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+                distributeData(rdata, index, x1, x2, maxX3);
+                distributeData(rdata, index, x1, x2, maxX3m1);
+            }
+        }
+    }
+    // NORTHEAST
+    else if (sendDir == D3Q27System::SW) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, minX2, x3);
+            distributeData(rdata, index, minX1p1, minX2p1, x3);
+            distributeData(rdata, index, minX1, minX2p1, x3);
+            distributeData(rdata, index, minX1p1, minX2, x3);
+        }
+    }
+    // NORTHWEST
+    else if (sendDir == D3Q27System::SE) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, minX2, x3);
+            distributeData(rdata, index, maxX1m1, minX2p1, x3);
+            distributeData(rdata, index, maxX1, minX2p1, x3);
+            distributeData(rdata, index, maxX1m1, minX2, x3);
+        }
+    }
+    // SOUTHWEST
+    else if (sendDir == D3Q27System::NE) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, maxX1, maxX2, x3);
+            distributeData(rdata, index, maxX1m1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1, maxX2m1, x3);
+            distributeData(rdata, index, maxX1m1, maxX2, x3);
+        }
+    }
+    // SOUTHEAST
+    else if (sendDir == D3Q27System::NW) {
+        for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
+            distributeData(rdata, index, minX1, maxX2, x3);
+            distributeData(rdata, index, minX1p1, maxX2m1, x3);
+            distributeData(rdata, index, minX1, maxX2m1, x3);
+            distributeData(rdata, index, minX1p1, maxX2, x3);
+        }
+    } else if (sendDir == D3Q27System::BW)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, minX3);
+            distributeData(rdata, index, minX1p1, x2, minX3p1);
+            distributeData(rdata, index, minX1, x2, minX3p1);
+            distributeData(rdata, index, minX1p1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::TE)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, maxX3);
+            distributeData(rdata, index, maxX1m1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1, x2, maxX3m1);
+            distributeData(rdata, index, maxX1m1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::TW)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, minX1, x2, maxX3);
+            distributeData(rdata, index, minX1p1, x2, maxX3m1);
+            distributeData(rdata, index, minX1, x2, maxX3m1);
+            distributeData(rdata, index, minX1p1, x2, maxX3);
+        }
+    else if (sendDir == D3Q27System::BE)
+        for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
+            distributeData(rdata, index, maxX1, x2, minX3);
+            distributeData(rdata, index, maxX1m1, x2, minX3p1);
+            distributeData(rdata, index, maxX1, x2, minX3p1);
+            distributeData(rdata, index, maxX1m1, x2, minX3);
+        }
+    else if (sendDir == D3Q27System::BS)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, minX3);
+            distributeData(rdata, index, x1, minX2p1, minX3p1);
+            distributeData(rdata, index, x1, minX2, minX3p1);
+            distributeData(rdata, index, x1, minX2p1, minX3);
+        }
+    else if (sendDir == D3Q27System::TN)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, maxX3);
+            distributeData(rdata, index, x1, maxX2m1, maxX3m1);
+            distributeData(rdata, index, x1, maxX2, maxX3m1);
+            distributeData(rdata, index, x1, maxX2m1, maxX3);
+        }
+    else if (sendDir == D3Q27System::TS)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, minX2, maxX3);
+            distributeData(rdata, index, x1, minX2p1, maxX3m1);
+            distributeData(rdata, index, x1, minX2, maxX3m1);
+            distributeData(rdata, index, x1, minX2p1, maxX3);
+        }
+    else if (sendDir == D3Q27System::BN)
+        for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
+            distributeData(rdata, index, x1, maxX2, minX3);
+            distributeData(rdata, index, x1, maxX2m1, minX3p1);
+            distributeData(rdata, index, x1, maxX2, minX3p1);
+            distributeData(rdata, index, x1, maxX2m1, minX3);
+        }
+    else if (sendDir == D3Q27System::BNE) {
+        distributeData(rdata, index, maxX1, maxX2, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1, maxX2, minX3p1);
+        distributeData(rdata, index, maxX1, maxX2m1, minX3);
+        distributeData(rdata, index, maxX1m1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::BNW) {
+        distributeData(rdata, index, minX1, maxX2, minX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1p1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1, maxX2, minX3p1);
+        distributeData(rdata, index, minX1, maxX2m1, minX3);
+        distributeData(rdata, index, minX1p1, maxX2, minX3);
+    } else if (sendDir == D3Q27System::BSE) {
+        distributeData(rdata, index, maxX1, minX2, minX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1m1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1, minX2, minX3p1);
+        distributeData(rdata, index, maxX1, minX2p1, minX3);
+        distributeData(rdata, index, maxX1m1, minX2, minX3);
+    } else if (sendDir == D3Q27System::BSW) {
+        distributeData(rdata, index, minX1, minX2, minX3);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2, minX3p1);
+        distributeData(rdata, index, minX1p1, minX2p1, minX3);
+        distributeData(rdata, index, minX1, minX2, minX3p1);
+        distributeData(rdata, index, minX1, minX2p1, minX3);
+        distributeData(rdata, index, minX1p1, minX2, minX3);
+    } else if (sendDir == D3Q27System::TNE) {
+        distributeData(rdata, index, maxX1, maxX2, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1, maxX2, maxX3m1);
+        distributeData(rdata, index, maxX1, maxX2m1, maxX3);
+        distributeData(rdata, index, maxX1m1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::TNW) {
+        distributeData(rdata, index, minX1, maxX2, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1, maxX2, maxX3m1);
+        distributeData(rdata, index, minX1, maxX2m1, maxX3);
+        distributeData(rdata, index, minX1p1, maxX2, maxX3);
+    } else if (sendDir == D3Q27System::TSE) {
+        distributeData(rdata, index, maxX1, minX2, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1m1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1, minX2, maxX3m1);
+        distributeData(rdata, index, maxX1, minX2p1, maxX3);
+        distributeData(rdata, index, maxX1m1, minX2, maxX3);
+    } else if (sendDir == D3Q27System::TSW) {
+        distributeData(rdata, index, minX1, minX2, maxX3);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1p1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1, minX2, maxX3m1);
+        distributeData(rdata, index, minX1, minX2p1, maxX3);
+        distributeData(rdata, index, minX1p1, minX2, maxX3);
+    } else
+        UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+
+}
+//////////////////////////////////////////////////////////////////////////
 
 
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h
index 87448a414..eb3c1e084 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h
@@ -41,6 +41,7 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "basics/container/CbArray3D.h"
 #include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
 
 class EsoTwist3D;
 class Block3D;
@@ -61,6 +62,8 @@ public:
 
 protected:
    inline void updatePointers() override;
+   void fillData() override;
+   void distributeData() override;
    inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override;
    inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override;
 
@@ -83,6 +86,8 @@ private:
 
    SPtr<EsoTwist3D> h2Dis;
 
+   SPtr<PressureFieldArray3D> pressure;
+
 };
 //////////////////////////////////////////////////////////////////////////
 inline void ThreeDistributionsFullVectorConnector2::updatePointers()
@@ -192,6 +197,8 @@ inline void ThreeDistributionsFullVectorConnector2::fillData(vector_type& sdata,
    sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
 
    sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3);
+
+   sdata[index++] = (*this->pressure)(x1, x2, x3);
 }
 //////////////////////////////////////////////////////////////////////////
 inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3)
@@ -286,6 +293,8 @@ inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type&
    (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = rdata[index++];
 
    (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++];
+
+   (*this->pressure)(x1, x2, x3) = rdata[index++];
 }
 
 
diff --git a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
index d8ee65934..6739e5599 100644
--- a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
+++ b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp
@@ -80,7 +80,7 @@ void InteractorsHelper::deleteSolidBlocks()
         }
     }
 
-    if (deleteBlocks)
+    if (interactors.size() > 0 && deleteBlocks)
         updateGrid();
 }
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
index 37a414515..57d61fced 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h
@@ -49,6 +49,7 @@
 #include "ThreeDistributionsFullDirectConnector.h"
 #include "ThreeDistributionsFullDirectConnector2.h"
 #include "ThreeDistributionsFullVectorConnector.h"
+#include "ThreeDistributionsFullVectorConnector2.h"
 #include <basics/transmitter/TbTransmitterLocal.h>
 
 //! \brief  A class sets connectors between blocks.
@@ -159,6 +160,6 @@ void SetConnectorsBlockVisitor<T1, T2>::setRemoteConnectors(SPtr<Block3D> sblock
 using OneDistributionSetConnectorsBlockVisitor  = SetConnectorsBlockVisitor<OneDistributionFullDirectConnector, OneDistributionFullVectorConnector>;
 using TwoDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsFullDirectConnector, TwoDistributionsFullVectorConnector>;
 using ThreeDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector, ThreeDistributionsFullVectorConnector>;
-using ThreeDistributionsSetConnectorsBlockVisitor2 = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector2, ThreeDistributionsFullVectorConnector>;
+using ThreeDistributionsSetConnectorsBlockVisitor2 = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector2, ThreeDistributionsFullVectorConnector2>;
 
 #endif // SETCONNECTORSBLOCKVISITOR_H
-- 
GitLab