From 1f7ec97a56d8953b93993d81774b33c20cbe0259 Mon Sep 17 00:00:00 2001
From: kutscher <kutscher@irmb.tu-bs.de>
Date: Mon, 2 Aug 2021 16:10:16 +0200
Subject: [PATCH] add pressure field to local connector for two phase fields
 velocity kernel

---
 apps/cpu/MultiphaseDropletTest/droplet.cpp    |   4 +-
 .../WriteMultiphaseQuantitiesCoProcessor.cpp  |  12 +-
 .../Connectors/FullDirectConnector.h          |   2 +-
 .../Connectors/FullVectorConnector.h          |   4 +-
 ...ThreeDistributionsFullDirectConnector2.cpp |  74 +++++
 .../ThreeDistributionsFullDirectConnector2.h  |   7 +-
 ...ThreeDistributionsFullVectorConnector2.cpp |  99 ++++++
 .../ThreeDistributionsFullVectorConnector2.h  | 293 ++++++++++++++++++
 src/cpu/VirtualFluidsCore/Data/DataSet3D.h    |  10 +
 ...oPhaseFieldsVelocityCumulantLBMKernel2.cpp |  11 +-
 ...TwoPhaseFieldsVelocityCumulantLBMKernel2.h |   5 +-
 11 files changed, 504 insertions(+), 17 deletions(-)
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h

diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp
index 06038f3be..9764094fc 100644
--- a/apps/cpu/MultiphaseDropletTest/droplet.cpp
+++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp
@@ -266,13 +266,15 @@ void run(string configname)
         SPtr<UbScheduler> visSch(new UbScheduler(outTime));
         SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor(
             grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
-        //pp->process(0);
+        pp->process(0);
         //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor(
         //    grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm));
 
         SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
         SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
 
+        omp_set_num_threads(numOfThreads);
+
         SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
         SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
         calculator->addCoProcessor(npr);
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
index 1388f369d..42cec5c5e 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp
@@ -157,7 +157,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     datanames.push_back("Vz");
     datanames.push_back("P1");
     datanames.push_back("Phi2");
-    if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) datanames.push_back("Pressure");
+    if (kernel->getDataSet()->getPressureField()) datanames.push_back("Pressure");
 
     data.resize(datanames.size());
 
@@ -168,6 +168,9 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
     SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions();
     SPtr<PhaseFieldArray3D> divU             = kernel->getDataSet()->getPhaseField();
 
+    SPtr<PressureFieldArray3D> pressure;
+    if (kernel->getDataSet()->getPressureField()) pressure = kernel->getDataSet()->getPressureField();
+
     LBMReal f[D3Q27System::ENDF + 1];
     LBMReal phi[D3Q27System::ENDF + 1];
     LBMReal phi2[D3Q27System::ENDF + 1];
@@ -347,7 +350,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                     // rho = phi[ZERO] + (1.0 - phi[ZERO])*1.0/densityRatio;
                     rho = rhoH + rhoToPhi * (phi[REST] - phiH);
 
-                    if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) {
+                    if (pressure) {
                         vx1 =
                             ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
                             (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) ;
@@ -429,10 +432,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
                     data[index++].push_back(vx3);
                     data[index++].push_back(p1);
                     data[index++].push_back(phi2[REST]);
-                    if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) {
-                        data[index++].push_back((*dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure)(ix1, ix2, ix3));
-                    }
-                   // else { data[index++].push_back(999); }
+                    if (pressure) data[index++].push_back((*pressure)(ix1, ix2, ix3));
                 }
             }
         }
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
index fb04de68a..81984eee9 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h
@@ -49,7 +49,7 @@ public:
 
 protected:
     virtual void updatePointers() = 0;
-    void exchangeData();
+    virtual void exchangeData();
     virtual void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) = 0;
 
     int maxX1;
diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
index 39fc3d1af..802a91290 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h
@@ -56,8 +56,8 @@ public:
 
 protected:
     virtual void updatePointers() = 0;
-    void fillData();
-    void distributeData();
+    virtual void fillData();
+    virtual void distributeData();
     virtual void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) = 0;
     virtual void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) = 0;
     
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp
index dd6ea50e2..78cc34f20 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp
@@ -51,6 +51,8 @@ void ThreeDistributionsFullDirectConnector2::init()
 	hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions());
     hFrom2 = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getH2distributions());
     hTo2  = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getH2distributions());
+    pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField();
+    pressureTo   = to.lock()->getKernel()->getDataSet()->getPressureField();
 }
 //////////////////////////////////////////////////////////////////////////
 void ThreeDistributionsFullDirectConnector2::sendVectors()
@@ -151,6 +153,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData()
         for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
             exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3);
             exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3);
+            exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3);
+            exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3);
         }
     }
     // NORTHWEST
@@ -158,6 +162,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData()
         for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
             exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3);
             exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3);
+            exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3);
+            exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3);
         }
     }
     // SOUTHWEST
@@ -165,6 +171,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData()
         for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
             exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3);
             exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3);
+            exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3);
+            exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3);
         }
     }
     // SOUTHEAST
@@ -172,71 +180,137 @@ void ThreeDistributionsFullDirectConnector2::exchangeData()
         for (int x3 = minX3p2; x3 <= maxX3m2; x3++) {
             exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3);
             exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3);
+            exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3);
+            exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3);
         }
     } else if (sendDir == D3Q27System::TE)
         for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
             exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3);
             exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1);
+            exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1);
+            exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3);
         }
     else if (sendDir == D3Q27System::BW)
         for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
             exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3);
             exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1);
+            exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1);
+            exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3);
         }
     else if (sendDir == D3Q27System::BE)
         for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
             exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3);
             exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1);
+            exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1);
+            exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3);
         }
     else if (sendDir == D3Q27System::TW)
         for (int x2 = minX2p2; x2 <= maxX2m2; x2++) {
             exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3);
             exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1);
+            exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1);
+            exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3);
         }
     else if (sendDir == D3Q27System::TN)
         for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
             exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3);
             exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1);
+            exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1);
+            exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3);
         }
     else if (sendDir == D3Q27System::BS)
         for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
             exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3);
             exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1);
+            exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1);
+            exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3);
         }
     else if (sendDir == D3Q27System::BN)
         for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
             exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3);
             exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1);
+            exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1);
+            exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3);
         }
     else if (sendDir == D3Q27System::TS)
         for (int x1 = minX1p2; x1 <= maxX1m2; x1++) {
             exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3);
             exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1);
+            exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1);
+            exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3);
         }
     else if (sendDir == D3Q27System::TSW) {
         exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3);
         exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1);
+        exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1);
+        exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3);
+        exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1);
+        exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3);
+        exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3);
     } else if (sendDir == D3Q27System::TSE) {
         exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3);
         exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1);
+        exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1);
+        exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3);
+        exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1);
+        exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3);
+        exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3);
     } else if (sendDir == D3Q27System::TNW) {
         exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3);
         exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1);
+        exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1);
+        exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3);
+        exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1);
+        exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3);
+        exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3);
     } else if (sendDir == D3Q27System::TNE) {
         exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3);
         exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1);
+        exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1);
+        exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3);
+        exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1);
+        exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3);
+        exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3);
     } else if (sendDir == D3Q27System::BSW) {
         exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3);
         exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1);
+        exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1);
+        exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3);
+        exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1);
+        exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3);
+        exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3);
     } else if (sendDir == D3Q27System::BSE) {
         exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3);
         exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1);
+        exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1);
+        exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3);
+        exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1);
+        exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3);
+        exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3);
     } else if (sendDir == D3Q27System::BNW) {
         exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3);
         exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1);
+        exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1);
+        exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3);
+        exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1);
+        exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3);
+        exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3);
     } else if (sendDir == D3Q27System::BNE) {
         exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3);
         exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1);
+        exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1);
+        exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3);
+        exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1);
+        exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3);
+        exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3);
     } else
         UB_THROW(UbException(UB_EXARGS, "unknown dir"));
 
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h
index 1ced5129b..3375f570d 100644
--- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h
@@ -40,6 +40,7 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "basics/container/CbArray3D.h"
 #include "basics/container/CbArray4D.h"
+#include "DataSet3D.h"
 
 //! \brief   Exchange data between blocks. 
 //! \details Connector send and receive full distributions between two blocks in shared memory.
@@ -53,7 +54,7 @@ public:
 
 protected:
     inline void updatePointers() override;
-    void exchangeData();
+    void exchangeData() override;
     inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override;
 
 private:
@@ -83,6 +84,8 @@ private:
 
 	SPtr<EsoTwist3D> fFrom, hFrom, hFrom2;
     SPtr<EsoTwist3D> fTo, hTo, hTo2;
+
+    SPtr<PressureFieldArray3D> pressureFrom, pressureTo;
 };
 //////////////////////////////////////////////////////////////////////////
 inline void ThreeDistributionsFullDirectConnector2::updatePointers()
@@ -230,5 +233,7 @@ inline void ThreeDistributionsFullDirectConnector2::exchangeData(int x1From, int
         (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
 
     (*this->zeroDistributionsToh2)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh2)(x1From, x2From, x3From);
+
+    (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From);
 }
 #endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
new file mode 100644
index 000000000..a9e3c7e74
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp
@@ -0,0 +1,99 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file ThreeDistributionsFullVectorConnector2.cpp
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "ThreeDistributionsFullVectorConnector2.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "EsoTwist3D.h"
+#include "DataSet3D.h"
+
+//////////////////////////////////////////////////////////////////////////
+ThreeDistributionsFullVectorConnector2::ThreeDistributionsFullVectorConnector2(SPtr<Block3D> block,
+                                                                         VectorTransmitterPtr sender,
+                                                                         VectorTransmitterPtr receiver, int sendDir)
+    : FullVectorConnector(block, sender, receiver, sendDir)
+{
+   if (!block || !sender || !receiver)
+      UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThreeDistributionsFullVectorConnector2::init()
+{
+   FullVectorConnector::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());
+
+   int anz = 3*27;
+   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::N:
+   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
+   case D3Q27System::T:
+   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 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::TE:
+   case D3Q27System::BW:
+   case D3Q27System::BE:
+   case D3Q27System::TW:  sender->getData().resize(maxX2*anz, 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::TNE:
+   case D3Q27System::BSW:
+   case D3Q27System::BNE:
+   case D3Q27System::TSW:
+   case D3Q27System::TSE:
+   case D3Q27System::BNW:
+   case D3Q27System::BSE:
+   case D3Q27System::TNW:  sender->getData().resize(anz, 0.0);   break;
+
+   default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
+   }
+}
+
+
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h
new file mode 100644
index 000000000..87448a414
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h
@@ -0,0 +1,293 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  This file is part of VirtualFluids. VirtualFluids is free software: you can
+//  redistribute it and/or modify it under the terms of the GNU General Public
+//  License as published by the Free Software Foundation, either version 3 of
+//  the License, or (at your option) any later version.
+//
+//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
+//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+//  for more details.
+//
+//  You should have received a copy of the GNU General Public License along
+//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
+//
+//! \file ThreeDistributionsFullVectorConnector2.h
+//! \ingroup Connectors
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef ThreeDistributionsFullVectorConnector2_H
+#define ThreeDistributionsFullVectorConnector2_H
+
+#include <vector>
+
+#include "FullVectorConnector.h"
+#include "D3Q27System.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+
+class EsoTwist3D;
+class Block3D;
+
+//daten werden in einen vector (dieser befindet sich im transmitter) kopiert
+//der vector wird via transmitter uebertragen
+//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein
+//transmitter sein, der von Transmitter abgeleitet ist ;-)
+class ThreeDistributionsFullVectorConnector2 : public FullVectorConnector
+{
+public:
+   ThreeDistributionsFullVectorConnector2(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir);
+
+   void init() override;
+
+   void fillSendVectors() override;
+   void distributeReceiveVectors() override;
+
+protected:
+   inline void updatePointers() 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;
+
+private:
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributions;
+
+   SPtr<EsoTwist3D>  fDis;
+
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroHdistributions;
+
+   SPtr<EsoTwist3D>  hDis;
+
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localH2distributions;
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalH2distributions;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroH2distributions;
+
+   SPtr<EsoTwist3D> h2Dis;
+
+};
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsFullVectorConnector2::updatePointers()
+{
+    localDistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions();
+    nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions();
+    zeroDistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions();
+
+    localHdistributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions();
+    nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions();
+    zeroHdistributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions();
+
+    localH2distributions    = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getLocalDistributions();
+    nonLocalH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getNonLocalDistributions();
+    zeroH2distributions     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getZeroDistributions();
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsFullVectorConnector2::fillData(vector_type& sdata, int& index, int x1, int x2, int x3)
+{
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroDistributions)(x1, x2, x3);
+
+
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3);
+
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3);
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3)
+{
+   (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroDistributions)(x1, x2, x3) = rdata[index++];
+
+   
+   (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++];
+
+   (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3)           = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3)          = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3)      = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3)         = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3)     = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3)     = rdata[index++];
+   (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1)           = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1)      = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1)          = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1)     = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1)     = rdata[index++];
+   (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1)         = rdata[index++];
+
+   (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++];
+}
+
+
+#endif 
+
diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
index e53e38a74..6b858e6ec 100644
--- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
+++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
@@ -44,6 +44,7 @@ using AverageValuesArray3D     = CbArray4D<LBMReal, IndexerX4X3X2X1>;
 using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>;
 using RelaxationFactorArray3D  = CbArray3D<LBMReal, IndexerX3X2X1>;
 using PhaseFieldArray3D        = CbArray3D<LBMReal, IndexerX3X2X1>;
+using PressureFieldArray3D     = CbArray3D<LBMReal, IndexerX3X2X1>;
 
 //! A class provides an interface for data structures in the kernel.
 class DataSet3D
@@ -88,6 +89,9 @@ public:
     SPtr<PhaseFieldArray3D> getPhaseField2() const;
     void setPhaseField2(SPtr<PhaseFieldArray3D> values);
 
+    SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const;
+    void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values);
+
 protected:
 private:
     SPtr<DistributionArray3D> fdistributions;
@@ -103,8 +107,10 @@ private:
     SPtr<ShearStressValuesArray3D> shearStressValues;
 
     SPtr<RelaxationFactorArray3D> relaxationFactor;
+    
     SPtr<PhaseFieldArray3D> phaseField;
     SPtr<PhaseFieldArray3D> phaseField2;
+    SPtr<PressureFieldArray3D> pressureField;
 };
 
 inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; }
@@ -162,4 +168,8 @@ inline SPtr<PhaseFieldArray3D> DataSet3D::getPhaseField2() const { return phaseF
 
 inline void DataSet3D::setPhaseField2(SPtr<PhaseFieldArray3D> values) { phaseField2 = values; }
 
+inline SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const { return pressureField; }
+
+inline void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values) { pressureField = values; }
+
 #endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp
index 13f8ce77f..97a8196db 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp
@@ -51,12 +51,13 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::initDataSet()
     SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
     SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field
     SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D(            nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
-	pressure= CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new  CbArray3D<LBMReal, IndexerX3X2X1>(    nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
 	pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new  CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0));
     dataSet->setFdistributions(f);
     dataSet->setHdistributions(h); // For phase-field
     dataSet->setH2distributions(h2); // For phase-field
     dataSet->setPhaseField(divU);
+	dataSet->setPressureField(pressure);
 }
 //////////////////////////////////////////////////////////////////////////
 SPtr<LBMKernel> MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::clone()
@@ -153,6 +154,8 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::calculate(int step)
     nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions();
     zeroDistributionsH2     = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions();
 
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField();
+
     SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
 
     const int bcArrayMaxX1 = (int)bcArray->getNX1();
@@ -176,9 +179,9 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::calculate(int step)
             new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0));
 
 //#pragma omp parallel for
-	  for (int x3 = minX3-1; x3 <= maxX3; x3++) {
-            for (int x2 = minX2-1; x2 <= maxX2; x2++) {
-                for (int x1 = minX1-1; x1 <= maxX1; x1++) {
+	  for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) {
+            for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) {
+                for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) {
                     if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) {
                         int x1p = x1 + 1;
                         int x2p = x2 + 1;
diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h
index 2b899d0ea..d3be0fa92 100644
--- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h
+++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h
@@ -57,8 +57,8 @@ public:
    void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2);
 
    ///refactor
-   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
-   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
+   //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure;
+   
 
    double getCalculationTime() override { return .0; }
 protected:
@@ -80,6 +80,7 @@ protected:
 
    //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr   phaseField;
 
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld;
 
    LBMReal h  [D3Q27System::ENDF+1];
    LBMReal h2[D3Q27System::ENDF + 1];
-- 
GitLab