From 52412fe81147de9360265877e872b6b634793183 Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Tue, 9 Mar 2021 16:50:12 +0000
Subject: [PATCH] Refactoring of gpu: calc macroscopic values

---
 src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu | 416 ++++++++++++---------
 1 file changed, 243 insertions(+), 173 deletions(-)

diff --git a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
index 69c0b8859..6abd63d49 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/CalcMac27.cu
@@ -10,6 +10,235 @@
 #include "LBM/D3Q27.h"
 #include "Core/RealConstants.h"
 
+static const int E    = 0;
+static const int W    = 1;
+static const int N    = 2;
+static const int S    = 3;
+static const int T    = 4;
+static const int B    = 5;
+static const int NE   = 6;
+static const int SW   = 7;
+static const int SE   = 8;
+static const int NW   = 9;
+static const int TE   = 10;
+static const int BW   = 11;
+static const int BE   = 12;
+static const int TW   = 13;
+static const int TN   = 14;
+static const int BS   = 15;
+static const int BN   = 16;
+static const int TS   = 17;
+static const int TNE  = 18;
+static const int TNW  = 19;
+static const int TSE  = 20;
+static const int TSW  = 21;
+static const int BNE  = 22;
+static const int BNW  = 23;
+static const int BSE  = 24;
+static const int BSW  = 25;
+static const int REST = 26;
+
+__device__ real getDensity(const real *const &f /*[27]*/)
+{
+    return ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
+           (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
+            ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
+           ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[REST];
+}
+
+
+__device__ real getIncompVelocityX1(const real *const &f /*[27]*/)
+{
+    return ((((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]));
+}
+
+
+__device__ real getIncompVelocityX2(const real *const &f /*[27]*/)
+{
+    return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
+            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S]));
+}
+
+
+__device__ real getIncompVelocityX3(const real *const &f /*[27]*/)
+{
+    return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
+            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B]));
+}
+
+
+
+__device__ Distributions27 getDistributions(real* DD, unsigned int size_Mat, bool evenOrOdd)
+{
+    Distributions27 D;
+    if (evenOrOdd)
+    {
+        D.f[dirE   ] = &DD[dirE   *size_Mat];
+        D.f[dirW   ] = &DD[dirW   *size_Mat];
+        D.f[dirN   ] = &DD[dirN   *size_Mat];
+        D.f[dirS   ] = &DD[dirS   *size_Mat];
+        D.f[dirT   ] = &DD[dirT   *size_Mat];
+        D.f[dirB   ] = &DD[dirB   *size_Mat];
+        D.f[dirNE  ] = &DD[dirNE  *size_Mat];
+        D.f[dirSW  ] = &DD[dirSW  *size_Mat];
+        D.f[dirSE  ] = &DD[dirSE  *size_Mat];
+        D.f[dirNW  ] = &DD[dirNW  *size_Mat];
+        D.f[dirTE  ] = &DD[dirTE  *size_Mat];
+        D.f[dirBW  ] = &DD[dirBW  *size_Mat];
+        D.f[dirBE  ] = &DD[dirBE  *size_Mat];
+        D.f[dirTW  ] = &DD[dirTW  *size_Mat];
+        D.f[dirTN  ] = &DD[dirTN  *size_Mat];
+        D.f[dirBS  ] = &DD[dirBS  *size_Mat];
+        D.f[dirBN  ] = &DD[dirBN  *size_Mat];
+        D.f[dirTS  ] = &DD[dirTS  *size_Mat];
+        D.f[dirZERO] = &DD[dirZERO*size_Mat];
+        D.f[dirTNE ] = &DD[dirTNE *size_Mat];
+        D.f[dirTSW ] = &DD[dirTSW *size_Mat];
+        D.f[dirTSE ] = &DD[dirTSE *size_Mat];
+        D.f[dirTNW ] = &DD[dirTNW *size_Mat];
+        D.f[dirBNE ] = &DD[dirBNE *size_Mat];
+        D.f[dirBSW ] = &DD[dirBSW *size_Mat];
+        D.f[dirBSE ] = &DD[dirBSE *size_Mat];
+        D.f[dirBNW ] = &DD[dirBNW *size_Mat];
+    }
+    else
+    {
+        D.f[dirW   ] = &DD[dirE   *size_Mat];
+        D.f[dirE   ] = &DD[dirW   *size_Mat];
+        D.f[dirS   ] = &DD[dirN   *size_Mat];
+        D.f[dirN   ] = &DD[dirS   *size_Mat];
+        D.f[dirB   ] = &DD[dirT   *size_Mat];
+        D.f[dirT   ] = &DD[dirB   *size_Mat];
+        D.f[dirSW  ] = &DD[dirNE  *size_Mat];
+        D.f[dirNE  ] = &DD[dirSW  *size_Mat];
+        D.f[dirNW  ] = &DD[dirSE  *size_Mat];
+        D.f[dirSE  ] = &DD[dirNW  *size_Mat];
+        D.f[dirBW  ] = &DD[dirTE  *size_Mat];
+        D.f[dirTE  ] = &DD[dirBW  *size_Mat];
+        D.f[dirTW  ] = &DD[dirBE  *size_Mat];
+        D.f[dirBE  ] = &DD[dirTW  *size_Mat];
+        D.f[dirBS  ] = &DD[dirTN  *size_Mat];
+        D.f[dirTN  ] = &DD[dirBS  *size_Mat];
+        D.f[dirTS  ] = &DD[dirBN  *size_Mat];
+        D.f[dirBN  ] = &DD[dirTS  *size_Mat];
+        D.f[dirZERO] = &DD[dirZERO*size_Mat];
+        D.f[dirTNE ] = &DD[dirBSW *size_Mat];
+        D.f[dirTSW ] = &DD[dirBNE *size_Mat];
+        D.f[dirTSE ] = &DD[dirBNW *size_Mat];
+        D.f[dirTNW ] = &DD[dirBSE *size_Mat];
+        D.f[dirBNE ] = &DD[dirTSW *size_Mat];
+        D.f[dirBSW ] = &DD[dirTNE *size_Mat];
+        D.f[dirBSE ] = &DD[dirTNW *size_Mat];
+        D.f[dirBNW ] = &DD[dirTSE *size_Mat];
+    }
+    return D;
+}
+
+struct Distribution27
+{
+   real f[27];
+};
+
+__device__ Distribution27 getDistribution(real* DD, unsigned int size_Mat, bool evenOrOdd, unsigned int k,
+                                    unsigned int* neighborX,
+                                    unsigned int* neighborY,
+                                    unsigned int* neighborZ)
+{
+    unsigned int kzero= k;
+    unsigned int ke   = k;
+    unsigned int kw   = neighborX[k];
+    unsigned int kn   = k;
+    unsigned int ks   = neighborY[k];
+    unsigned int kt   = k;
+    unsigned int kb   = neighborZ[k];
+    unsigned int ksw  = neighborY[kw];
+    unsigned int kne  = k;
+    unsigned int kse  = ks;
+    unsigned int knw  = kw;
+    unsigned int kbw  = neighborZ[kw];
+    unsigned int kte  = k;
+    unsigned int kbe  = kb;
+    unsigned int ktw  = kw;
+    unsigned int kbs  = neighborZ[ks];
+    unsigned int ktn  = k;
+    unsigned int kbn  = kb;
+    unsigned int kts  = ks;
+    unsigned int ktse = ks;
+    unsigned int kbnw = kbw;
+    unsigned int ktnw = kw;
+    unsigned int kbse = kbs;
+    unsigned int ktsw = ksw;
+    unsigned int kbne = kb;
+    unsigned int ktne = k;
+    unsigned int kbsw = neighborZ[ksw];
+
+    Distributions27 D = getDistributions(DD, size_Mat, evenOrOdd);
+
+//       real f_dirE = (D.f[dirE])[ke];
+//       real f_dirW = (D.f[dirW])[kw];
+//       real f_dirN = (D.f[dirN])[kn];
+//       real f_dirS = (D.f[dirS])[ks];
+//       real f_dirT = (D.f[dirT])[kt];
+//       real f_dirB = (D.f[dirB])[kb];
+//
+//       real f_dirNE = (D.f[dirNE])[kne];
+//       real f_dirSW = (D.f[dirSW])[ksw];
+//       real f_dirSE = (D.f[dirSE])[kse];
+//       real f_dirNW = (D.f[dirNW])[knw];
+//       real f_dirTE = (D.f[dirTE])[kte];
+//       real f_dirBW = (D.f[dirBW])[kbw];
+//
+//       real f_dirBE = (D.f[dirBE])[kbe];
+//       real f_dirTW = (D.f[dirTW])[ktw];
+//       real f_dirTN = (D.f[dirTN])[ktn];
+//       real f_dirBS = (D.f[dirBS])[kbs];
+//       real f_dirBN = (D.f[dirBN])[kbn];
+//       real f_dirTS = (D.f[dirTS])[kts];
+//
+//       real f_dirZERO = (D.f[dirZERO])[kzero];
+//
+//       real f_dirTNE = (D.f[dirTNE ])[ktne];
+//       real f_dirTSW = (D.f[dirTSW ])[ktsw];
+//       real f_dirTSE = (D.f[dirTSE ])[ktse];
+//       real f_dirTNW = (D.f[dirTNW ])[ktnw];
+//       real f_dirBNE = (D.f[dirBNE ])[kbne];
+//       real f_dirBSW = (D.f[dirBSW ])[kbsw];
+//       real f_dirBSE = (D.f[dirBSE ])[kbse];
+//       real f_dirBNW = (D.f[dirBNW ])[kbnw];
+
+
+return {
+        (D.f[dirE])[ke],
+        (D.f[dirW])[kw],
+        (D.f[dirN])[kn],
+        (D.f[dirS])[ks],
+        (D.f[dirT])[kt],
+        (D.f[dirB])[kb],
+        (D.f[dirNE])[kne],
+        (D.f[dirSW])[ksw],
+        (D.f[dirSE])[kse],
+        (D.f[dirNW])[knw],
+        (D.f[dirTE])[kte],
+        (D.f[dirBW])[kbw],
+        (D.f[dirBE])[kbe],
+        (D.f[dirTW])[ktw],
+        (D.f[dirTN])[ktn],
+        (D.f[dirBS])[kbs],
+        (D.f[dirBN])[kbn],
+        (D.f[dirTS])[kts],
+        (D.f[dirZERO])[kzero],
+        (D.f[dirTNE ])[ktne],
+        (D.f[dirTSW ])[ktsw],
+        (D.f[dirTSE ])[ktse],
+        (D.f[dirTNW ])[ktnw],
+        (D.f[dirBNE ])[kbne],
+        (D.f[dirBSW ])[kbsw],
+        (D.f[dirBSE ])[kbse],
+        (D.f[dirBNW ])[kbnw]
+    };
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 extern "C" __global__ void LBCalcMac27( real* vxD,
                                         real* vyD,
@@ -23,141 +252,20 @@ extern "C" __global__ void LBCalcMac27( real* vxD,
                                         real* DD,
                                         bool evenOrOdd)
 {
-   Distributions27 D;
-   if (evenOrOdd==true)
-   {
-      D.f[dirE   ] = &DD[dirE   *size_Mat];
-      D.f[dirW   ] = &DD[dirW   *size_Mat];
-      D.f[dirN   ] = &DD[dirN   *size_Mat];
-      D.f[dirS   ] = &DD[dirS   *size_Mat];
-      D.f[dirT   ] = &DD[dirT   *size_Mat];
-      D.f[dirB   ] = &DD[dirB   *size_Mat];
-      D.f[dirNE  ] = &DD[dirNE  *size_Mat];
-      D.f[dirSW  ] = &DD[dirSW  *size_Mat];
-      D.f[dirSE  ] = &DD[dirSE  *size_Mat];
-      D.f[dirNW  ] = &DD[dirNW  *size_Mat];
-      D.f[dirTE  ] = &DD[dirTE  *size_Mat];
-      D.f[dirBW  ] = &DD[dirBW  *size_Mat];
-      D.f[dirBE  ] = &DD[dirBE  *size_Mat];
-      D.f[dirTW  ] = &DD[dirTW  *size_Mat];
-      D.f[dirTN  ] = &DD[dirTN  *size_Mat];
-      D.f[dirBS  ] = &DD[dirBS  *size_Mat];
-      D.f[dirBN  ] = &DD[dirBN  *size_Mat];
-      D.f[dirTS  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirTNE *size_Mat];
-      D.f[dirTSW ] = &DD[dirTSW *size_Mat];
-      D.f[dirTSE ] = &DD[dirTSE *size_Mat];
-      D.f[dirTNW ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNE ] = &DD[dirBNE *size_Mat];
-      D.f[dirBSW ] = &DD[dirBSW *size_Mat];
-      D.f[dirBSE ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNW ] = &DD[dirBNW *size_Mat];
-   } 
-   else
-   {
-      D.f[dirW   ] = &DD[dirE   *size_Mat];
-      D.f[dirE   ] = &DD[dirW   *size_Mat];
-      D.f[dirS   ] = &DD[dirN   *size_Mat];
-      D.f[dirN   ] = &DD[dirS   *size_Mat];
-      D.f[dirB   ] = &DD[dirT   *size_Mat];
-      D.f[dirT   ] = &DD[dirB   *size_Mat];
-      D.f[dirSW  ] = &DD[dirNE  *size_Mat];
-      D.f[dirNE  ] = &DD[dirSW  *size_Mat];
-      D.f[dirNW  ] = &DD[dirSE  *size_Mat];
-      D.f[dirSE  ] = &DD[dirNW  *size_Mat];
-      D.f[dirBW  ] = &DD[dirTE  *size_Mat];
-      D.f[dirTE  ] = &DD[dirBW  *size_Mat];
-      D.f[dirTW  ] = &DD[dirBE  *size_Mat];
-      D.f[dirBE  ] = &DD[dirTW  *size_Mat];
-      D.f[dirBS  ] = &DD[dirTN  *size_Mat];
-      D.f[dirTN  ] = &DD[dirBS  *size_Mat];
-      D.f[dirTS  ] = &DD[dirBN  *size_Mat];
-      D.f[dirBN  ] = &DD[dirTS  *size_Mat];
-      D.f[dirZERO] = &DD[dirZERO*size_Mat];
-      D.f[dirTNE ] = &DD[dirBSW *size_Mat];
-      D.f[dirTSW ] = &DD[dirBNE *size_Mat];
-      D.f[dirTSE ] = &DD[dirBNW *size_Mat];
-      D.f[dirTNW ] = &DD[dirBSE *size_Mat];
-      D.f[dirBNE ] = &DD[dirTSW *size_Mat];
-      D.f[dirBSW ] = &DD[dirTNE *size_Mat];
-      D.f[dirBSE ] = &DD[dirTNW *size_Mat];
-      D.f[dirBNW ] = &DD[dirTSE *size_Mat];
-   }
-   ////////////////////////////////////////////////////////////////////////////////
-   unsigned int  k;                   // Zugriff auf arrays im device
-   //
-   unsigned int tx = threadIdx.x;     // Thread index = lokaler i index
-   unsigned int by = blockIdx.x;      // Block index x
-   unsigned int bz = blockIdx.y;      // Block index y
-   unsigned int  x = tx + STARTOFFX;  // Globaler x-Index 
-   unsigned int  y = by + STARTOFFY;  // Globaler y-Index 
-   unsigned int  z = bz + STARTOFFZ;  // Globaler z-Index 
+   const unsigned int tx = threadIdx.x;    // Thread index = lokaler i index
+   const unsigned int by = blockIdx.x;     // Block index x
+   const unsigned int bz = blockIdx.y;     // Block index y
+   const unsigned int x = tx + STARTOFFX;  // Globaler x-Index 
+   const unsigned int y = by + STARTOFFY;  // Globaler y-Index 
+   const unsigned int z = bz + STARTOFFZ;  // Globaler z-Index 
 
    const unsigned sizeX = blockDim.x;
    const unsigned sizeY = gridDim.x;
    const unsigned nx = sizeX + 2 * STARTOFFX;
    const unsigned ny = sizeY + 2 * STARTOFFY;
 
-   k = nx*(ny*z + y) + x;
-   //////////////////////////////////////////////////////////////////////////
-   //index
-   unsigned int kzero= k;
-   unsigned int ke   = k;
-   unsigned int kw   = neighborX[k];
-   unsigned int kn   = k;
-   unsigned int ks   = neighborY[k];
-   unsigned int kt   = k;
-   unsigned int kb   = neighborZ[k];
-   unsigned int ksw  = neighborY[kw];
-   unsigned int kne  = k;
-   unsigned int kse  = ks;
-   unsigned int knw  = kw;
-   unsigned int kbw  = neighborZ[kw];
-   unsigned int kte  = k;
-   unsigned int kbe  = kb;
-   unsigned int ktw  = kw;
-   unsigned int kbs  = neighborZ[ks];
-   unsigned int ktn  = k;
-   unsigned int kbn  = kb;
-   unsigned int kts  = ks;
-   unsigned int ktse = ks;
-   unsigned int kbnw = kbw;
-   unsigned int ktnw = kw;
-   unsigned int kbse = kbs;
-   unsigned int ktsw = ksw;
-   unsigned int kbne = kb;
-   unsigned int ktne = k;
-   unsigned int kbsw = neighborZ[ksw];
-   //unsigned int nxny = nx*ny;
-   //unsigned int kzero= k;
-   //unsigned int ke   = k;
-   //unsigned int kw   = k + 1;
-   //unsigned int kn   = k;
-   //unsigned int ks   = k + nx;
-   //unsigned int kt   = k;
-   //unsigned int kb   = k + nxny;
-   //unsigned int ksw  = k + nx + 1;
-   //unsigned int kne  = k;
-   //unsigned int kse  = k + nx;
-   //unsigned int knw  = k + 1;
-   //unsigned int kbw  = k + nxny + 1;
-   //unsigned int kte  = k;
-   //unsigned int kbe  = k + nxny;
-   //unsigned int ktw  = k + 1;
-   //unsigned int kbs  = k + nxny + nx;
-   //unsigned int ktn  = k;
-   //unsigned int kbn  = k + nxny;
-   //unsigned int kts  = k + nx;
-   //unsigned int ktse = k + nx;
-   //unsigned int kbnw = k + nxny + 1;
-   //unsigned int ktnw = k + 1;
-   //unsigned int kbse = k + nxny + nx;
-   //unsigned int ktsw = k + nx + 1;
-   //unsigned int kbne = k + nxny;
-   //unsigned int ktne = k;
-   //unsigned int kbsw = k + nxny + nx + 1;
-   //////////////////////////////////////////////////////////////////////////
+   const unsigned int k = nx*(ny*z + y) + x; // Zugriff auf arrays im device
+
    rhoD[k] = c0o1;
    vxD[k]  = c0o1;
    vyD[k]  = c0o1;
@@ -165,50 +273,12 @@ extern "C" __global__ void LBCalcMac27( real* vxD,
 
    if(geoD[k] == GEO_FLUID)
    {
-      rhoD[k]    =   (D.f[dirE   ])[ke  ]+ (D.f[dirW   ])[kw  ]+ 
-                     (D.f[dirN   ])[kn  ]+ (D.f[dirS   ])[ks  ]+
-                     (D.f[dirT   ])[kt  ]+ (D.f[dirB   ])[kb  ]+
-                     (D.f[dirNE  ])[kne ]+ (D.f[dirSW  ])[ksw ]+
-                     (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTE  ])[kte ]+ (D.f[dirBW  ])[kbw ]+
-                     (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTN  ])[ktn ]+ (D.f[dirBS  ])[kbs ]+
-                     (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                     (D.f[dirZERO])[kzero]+ 
-                     (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]+ (D.f[dirBSW ])[kbsw]+ 
-                     (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw];
-
-      vxD[k]     =   (D.f[dirE   ])[ke  ]- (D.f[dirW   ])[kw  ]+ 
-                     (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]+
-                     (D.f[dirSE  ])[kse ]- (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]+
-                     (D.f[dirBE  ])[kbe ]- (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]- (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]+ 
-                     (D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw];
-
-      vyD[k]     =   (D.f[dirN   ])[kn  ]- (D.f[dirS   ])[ks  ]+
-                     (D.f[dirNE  ])[kne ]- (D.f[dirSW  ])[ksw ]-
-                     (D.f[dirSE  ])[kse ]+ (D.f[dirNW  ])[knw ]+
-                     (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]+
-                     (D.f[dirBN  ])[kbn ]- (D.f[dirTS  ])[kts ]+
-                     (D.f[dirTNE ])[ktne]- (D.f[dirTSW ])[ktsw]- 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]+ 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                     (D.f[dirBSE ])[kbse]+ (D.f[dirBNW ])[kbnw];
-
-      vzD[k]     =   (D.f[dirT   ])[kt  ]- (D.f[dirB   ])[kb  ]+
-                     (D.f[dirTE  ])[kte ]- (D.f[dirBW  ])[kbw ]-
-                     (D.f[dirBE  ])[kbe ]+ (D.f[dirTW  ])[ktw ]+
-                     (D.f[dirTN  ])[ktn ]- (D.f[dirBS  ])[kbs ]-
-                     (D.f[dirBN  ])[kbn ]+ (D.f[dirTS  ])[kts ]+
-                     (D.f[dirTNE ])[ktne]+ (D.f[dirTSW ])[ktsw]+ 
-                     (D.f[dirTSE ])[ktse]+ (D.f[dirTNW ])[ktnw]- 
-                     (D.f[dirBNE ])[kbne]- (D.f[dirBSW ])[kbsw]- 
-                     (D.f[dirBSE ])[kbse]- (D.f[dirBNW ])[kbnw];
+       const auto distribution = getDistribution(DD, size_Mat, evenOrOdd, k, neighborX, neighborY, neighborZ);
+
+       rhoD[k] = getDensity(distribution.f);
+       vxD[k] = getIncompVelocityX1(distribution.f);
+       vyD[k] = getIncompVelocityX2(distribution.f);
+       vzD[k] = getIncompVelocityX3(distribution.f);
    }
 }
 
-- 
GitLab