diff --git a/apps/gpu/AtmosphericBoundaryLayer/AtmosphericBoundaryLayer.cpp b/apps/gpu/AtmosphericBoundaryLayer/AtmosphericBoundaryLayer.cpp
index 2b0606909e419b0cafb21afacbb632845d247b8b..deac5fbdcd6980bfe8866f28be03d7fa1fd3fdc2 100644
--- a/apps/gpu/AtmosphericBoundaryLayer/AtmosphericBoundaryLayer.cpp
+++ b/apps/gpu/AtmosphericBoundaryLayer/AtmosphericBoundaryLayer.cpp
@@ -335,7 +335,7 @@ void run(const vf::basics::ConfigurationFile& config)
     BoundaryConditionFactory bcFactory = BoundaryConditionFactory();
     bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityInterpolatedCompressible);
     bcFactory.setStressBoundaryCondition(BoundaryConditionFactory::StressBC::StressPressureBounceBack);
-    bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipCompressibleTurbulentViscosity);
+    bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipTurbulentViscosityCompressible);
     bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective);
     if (useDistributionsForPrecursor) {
         bcFactory.setPrecursorBoundaryCondition(BoundaryConditionFactory::PrecursorBC::DistributionsPrecursor);
diff --git a/pythonbindings/src/gpu/submodules/boundary_conditions.cpp b/pythonbindings/src/gpu/submodules/boundary_conditions.cpp
index cd1bba026bbbda4fa83c282b417ac407f5b8a3dc..e7d7e472277a69a15fac1c888542fe0aee5df6a8 100644
--- a/pythonbindings/src/gpu/submodules/boundary_conditions.cpp
+++ b/pythonbindings/src/gpu/submodules/boundary_conditions.cpp
@@ -74,11 +74,8 @@ namespace boundary_conditions
         .value("NoSlipInterpolatedCompressible", BoundaryConditionFactory::NoSlipBC::NoSlipInterpolatedCompressible);
 
         py::enum_<BoundaryConditionFactory::SlipBC>(parentModule, "SlipBC")
-        .value("SlipIncompressible", BoundaryConditionFactory::SlipBC::SlipIncompressible)
         .value("SlipCompressible", BoundaryConditionFactory::SlipBC::SlipCompressible)
-        .value("SlipBounceBack", BoundaryConditionFactory::SlipBC::SlipBounceBack)
-        .value("SlipCompressibleTurbulentViscosity", BoundaryConditionFactory::SlipBC::SlipCompressibleTurbulentViscosity)
-        .value("SlipPressureCompressibleTurbulentViscosity", BoundaryConditionFactory::SlipBC::SlipPressureCompressibleTurbulentViscosity)
+        .value("SlipTurbulentViscosityCompressible", BoundaryConditionFactory::SlipBC::SlipTurbulentViscosityCompressible)
         .value("NotSpecified", BoundaryConditionFactory::SlipBC::NotSpecified);
 
         py::enum_<BoundaryConditionFactory::PressureBC>(parentModule, "PressureBC")
diff --git a/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.cpp b/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.cpp
index 968b8070cdd34f871fe7f61a7ae060ec0f81db29..fb4dc113ce4524d857897398084f21cd4eedd2b7 100644
--- a/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.cpp
+++ b/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.cpp
@@ -37,6 +37,7 @@
 #include "BoundaryConditions/Pressure/Pressure.h"
 #include "BoundaryConditions/NoSlip/NoSlip.h"
 #include "BoundaryConditions/Velocity/Velocity.h"
+#include "BoundaryConditions/Slip/Slip.h"
 #include "GPU/GPU_Interface.h"
 
 
@@ -131,20 +132,11 @@ boundaryCondition BoundaryConditionFactory::getSlipBoundaryConditionPost(bool is
 
     // for descriptions of the boundary conditions refer to the header
     switch (boundaryCondition) {
-        case SlipBC::SlipIncompressible:
-            return QSlipDev27;
-            break;
         case SlipBC::SlipCompressible:
-            return QSlipDevComp27;
-            break;
-        case SlipBC::SlipBounceBack:
-            return BBSlipDevComp27;
-            break;
-        case SlipBC::SlipCompressibleTurbulentViscosity:
-            return QSlipDevCompTurbulentViscosity27;
+            return SlipCompressible;
             break;
-        case SlipBC::SlipPressureCompressibleTurbulentViscosity:
-            return QSlipPressureDevCompTurbulentViscosity27;
+        case SlipBC::SlipTurbulentViscosityCompressible:
+            return SlipTurbulentViscosityCompressible;
             break;
         default:
             return nullptr;
diff --git a/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.h b/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.h
index 9a7e23b2c63c9810f3bef2fcae360ec8331fd903..745a3b0dcdbaef51848470e734bbf46900dfe3f4 100644
--- a/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.h
+++ b/src/gpu/core/BoundaryConditions/BoundaryConditionFactory.h
@@ -82,16 +82,10 @@ public:
 
     //! \brief An enumeration for selecting a slip boundary condition
     enum class SlipBC {
-        //! - SlipIncompressible = interpolated slip boundary condition, based on subgrid distances
-        SlipIncompressible,
         //! - SlipCompressible = interpolated slip boundary condition, based on subgrid distances
         SlipCompressible,
-        //! - SlipBounceBack = simple bounce-back slip boundary condition.
-        SlipBounceBack,
         //! With turbulent viscosity -> para->setUseTurbulentViscosity(true) has to be set to true
-        SlipCompressibleTurbulentViscosity,
-        //! With turbulent viscosity -> para->setUseTurbulentViscosity(true) has to be set to true
-        SlipPressureCompressibleTurbulentViscosity,
+        SlipTurbulentViscosityCompressible,
         //! - NotSpecified =  the user did not set a boundary condition
         NotSpecified
     };
diff --git a/src/gpu/core/BoundaryConditions/BoundaryConditionFactoryTest.cpp b/src/gpu/core/BoundaryConditions/BoundaryConditionFactoryTest.cpp
index aaaae38e554f1f1011752c296b0706da602047c1..c936b2ea4bedb285b1726a6ec4f93ff928ba7652 100644
--- a/src/gpu/core/BoundaryConditions/BoundaryConditionFactoryTest.cpp
+++ b/src/gpu/core/BoundaryConditions/BoundaryConditionFactoryTest.cpp
@@ -8,6 +8,7 @@
 #include "BoundaryConditions/Pressure/Pressure.h"
 #include "BoundaryConditions/NoSlip/NoSlip.h"
 #include "BoundaryConditions/Velocity/Velocity.h"
+#include "BoundaryConditions/Slip/Slip.h"
 #include "GPU/GPU_Interface.h"
 
 using bcFunction = void (*)(LBMSimulationParameter *, QforBoundaryConditions *);
@@ -132,16 +133,12 @@ TEST(BoundaryConditionFactoryTest, slipBC)
 {
     auto bcFactory = BoundaryConditionFactory();
 
-    bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipIncompressible);
-    EXPECT_TRUE( *(getSlipBcTarget(bcFactory)) == QSlipDev27)
-        << "The returned boundary condition is not the expected function QSlipDev27.";
-
     bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipCompressible);
-    EXPECT_TRUE( *(getSlipBcTarget(bcFactory)) == QSlipDevComp27)
-        << "The returned boundary condition is not the expected function QSlipDevComp27.";
+    EXPECT_TRUE( *(getSlipBcTarget(bcFactory)) == SlipCompressible)
+        << "The returned boundary condition is not the expected function SlipCompressible.";
 
-    bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipCompressibleTurbulentViscosity);
-    EXPECT_TRUE( *(getSlipBcTarget(bcFactory)) == QSlipDevCompTurbulentViscosity27)
+    bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipTurbulentViscosityCompressible);
+    EXPECT_TRUE( *(getSlipBcTarget(bcFactory)) == SlipTurbulentViscosityCompressible)
         << "The returned boundary condition is not the expected function QSlipDevCompTurbulentViscosity27.";
 }
 
diff --git a/src/gpu/core/BoundaryConditions/Slip/Slip.cu b/src/gpu/core/BoundaryConditions/Slip/Slip.cu
new file mode 100644
index 0000000000000000000000000000000000000000..30308573e16a9b890032f5a55453f42c20f6e8c9
--- /dev/null
+++ b/src/gpu/core/BoundaryConditions/Slip/Slip.cu
@@ -0,0 +1,79 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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/>.
+//
+//! \author Martin Schoenherr
+//=======================================================================================
+#include <cuda_runtime.h>
+#include <helper_functions.h>
+#include <helper_cuda.h>
+
+#include "LBM/LB.h"
+#include <cuda_helper/CudaGrid.h>
+
+#include "BoundaryConditions/Slip/Slip_Device.cuh"
+#include "Parameter/Parameter.h"
+
+void SlipCompressible(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
+{
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+
+    SlipCompressible_Device<<< grid, threads >>> (
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("QSlipDeviceComp27 execution failed");
+}
+
+
+void SlipTurbulentViscosityCompressible(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
+{
+    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
+    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
+
+    SlipTurbulentViscosityCompressible_Device<<< grid, threads >>> (
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->q27[0],
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->turbViscosity,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+    getLastCudaError("SlipTurbulentViscosityCompressible_Device execution failed");
+}
diff --git a/src/gpu/core/BoundaryConditions/Slip/Slip.h b/src/gpu/core/BoundaryConditions/Slip/Slip.h
new file mode 100644
index 0000000000000000000000000000000000000000..01397d1f9102f11efbaf4a49e3e64d3a370a1ea2
--- /dev/null
+++ b/src/gpu/core/BoundaryConditions/Slip/Slip.h
@@ -0,0 +1,43 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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/>.
+//
+//! \author Martin Schoenherr
+//=======================================================================================
+#ifndef Slip_H
+#define Slip_H
+
+#include "LBM/LB.h"
+
+struct LBMSimulationParameter;
+class Parameter;
+
+void SlipCompressible(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
+
+void SlipTurbulentViscosityCompressible(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
+
+#endif
diff --git a/src/gpu/core/BoundaryConditions/Slip/SlipCompressible.cu b/src/gpu/core/BoundaryConditions/Slip/SlipCompressible.cu
new file mode 100644
index 0000000000000000000000000000000000000000..1f80b421a86c041d63bfb313a803175e6037436f
--- /dev/null
+++ b/src/gpu/core/BoundaryConditions/Slip/SlipCompressible.cu
@@ -0,0 +1,546 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 SlipBCs27.cu
+//! \ingroup GPU
+//! \author Martin Schoenherr, Anna Wellmann
+//======================================================================================
+#include "LBM/LB.h" 
+#include "lbm/constants/D3Q27.h"
+#include "basics/constants/NumericConstants.h"
+#include "LBM/GPUHelperFunctions/KernelUtilities.h"
+
+using namespace vf::basics::constant;
+using namespace vf::lbm::dir;
+using namespace vf::gpu;
+
+//////////////////////////////////////////////////////////////////////////////
+__global__ void SlipCompressible_Device(
+    real* distributions, 
+    int* subgridDistanceIndices, 
+    real* subgridDistances,
+    unsigned int numberOfBCnodes,
+    real omega, 
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes, 
+    bool isEvenTimestep)
+{
+   //! The slip boundary condition is executed in the following steps
+   //!
+
+   ////////////////////////////////////////////////////////////////////////////////
+   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
+   //!
+   const unsigned nodeIndex = getNodeIndex();
+
+   if(nodeIndex < numberOfBCnodes)
+   {
+      //////////////////////////////////////////////////////////////////////////
+      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
+      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
+      //!
+      Distributions27 dist;
+      getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set local subgrid distances (q's)
+      //!
+      SubgridDistances27 subgridD;
+      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
+      
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set neighbor indices (necessary for indirect addressing)
+      //!
+      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
+      unsigned int kzero= indexOfBCnode;
+      unsigned int ke   = indexOfBCnode;
+      unsigned int kw   = neighborX[indexOfBCnode];
+      unsigned int kn   = indexOfBCnode;
+      unsigned int ks   = neighborY[indexOfBCnode];
+      unsigned int kt   = indexOfBCnode;
+      unsigned int kb   = neighborZ[indexOfBCnode];
+      unsigned int ksw  = neighborY[kw];
+      unsigned int kne  = indexOfBCnode;
+      unsigned int kse  = ks;
+      unsigned int knw  = kw;
+      unsigned int kbw  = neighborZ[kw];
+      unsigned int kte  = indexOfBCnode;
+      unsigned int kbe  = kb;
+      unsigned int ktw  = kw;
+      unsigned int kbs  = neighborZ[ks];
+      unsigned int ktn  = indexOfBCnode;
+      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 = indexOfBCnode;
+      unsigned int kbsw = neighborZ[ksw];
+      
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set local distributions
+      //!
+      real f_W    = (dist.f[dP00])[ke   ];
+      real f_E    = (dist.f[dM00])[kw   ];
+      real f_S    = (dist.f[d0P0])[kn   ];
+      real f_N    = (dist.f[d0M0])[ks   ];
+      real f_B    = (dist.f[d00P])[kt   ];
+      real f_T    = (dist.f[d00M])[kb   ];
+      real f_SW   = (dist.f[dPP0])[kne  ];
+      real f_NE   = (dist.f[dMM0])[ksw  ];
+      real f_NW   = (dist.f[dPM0])[kse  ];
+      real f_SE   = (dist.f[dMP0])[knw  ];
+      real f_BW   = (dist.f[dP0P])[kte  ];
+      real f_TE   = (dist.f[dM0M])[kbw  ];
+      real f_TW   = (dist.f[dP0M])[kbe  ];
+      real f_BE   = (dist.f[dM0P])[ktw  ];
+      real f_BS   = (dist.f[d0PP])[ktn  ];
+      real f_TN   = (dist.f[d0MM])[kbs  ];
+      real f_TS   = (dist.f[d0PM])[kbn  ];
+      real f_BN   = (dist.f[d0MP])[kts  ];
+      real f_BSW  = (dist.f[dPPP])[ktne ];
+      real f_BNE  = (dist.f[dMMP])[ktsw ];
+      real f_BNW  = (dist.f[dPMP])[ktse ];
+      real f_BSE  = (dist.f[dMPP])[ktnw ];
+      real f_TSW  = (dist.f[dPPM])[kbne ];
+      real f_TNE  = (dist.f[dMMM])[kbsw ];
+      real f_TNW  = (dist.f[dPMM])[kbse ];
+      real f_TSE  = (dist.f[dMPM])[kbnw ];
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Calculate macroscopic quantities
+      //!
+      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
+                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
+                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
+
+      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
+                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
+                   (f_E - f_W)) / (c1o1 + drho);
+
+      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
+                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
+                   (f_N - f_S)) / (c1o1 + drho);
+
+      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
+                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
+                   (f_T - f_B)) / (c1o1 + drho);
+
+      real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - change the pointer to write the results in the correct array
+      //!
+      getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Multiply the local velocities by the slipLength
+      //!
+      real slipLength = c1o1;
+      real VeloX = slipLength*vx1;
+      real VeloY = slipLength*vx2;
+      real VeloZ = slipLength*vx3;
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Update distributions with subgrid distance (q) between zero and one
+      //!
+      real feq, q, velocityLB, velocityBC;
+
+      bool x = false;
+      bool y = false;
+      bool z = false;
+
+      q = (subgridD.q[dP00])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
+      {
+         VeloX = c0o1;
+         x = true;
+
+         velocityLB = vx1;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloX;
+         (dist.f[dM00])[kw] = getInterpolatedDistributionForVeloBC(q, f_E, f_W, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[dM00])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = c0o1;
+         x = true;
+
+         velocityLB = -vx1;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloX;
+         (dist.f[dP00])[ke] = getInterpolatedDistributionForVeloBC(q, f_W, f_E, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d0P0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = c0o1;
+         y = true;
+
+         velocityLB = vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloY;
+         (dist.f[d0M0])[ks] = getInterpolatedDistributionForVeloBC(q, f_N, f_S, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d0M0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = c0o1;
+         y = true;
+
+         velocityLB = -vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloY;
+         (dist.f[d0P0])[kn] = getInterpolatedDistributionForVeloBC(q, f_S, f_N, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d00P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloZ = c0o1;
+         z = true;
+
+         velocityLB = vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloZ;
+         (dist.f[d00M])[kb] = getInterpolatedDistributionForVeloBC(q, f_T, f_B, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d00M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloZ = c0o1;
+         z = true;
+
+         velocityLB = -vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloZ;
+         (dist.f[d00P])[kt] = getInterpolatedDistributionForVeloBC(q, f_B, f_T, feq, omega, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[dPP0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = vx1 + vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX + VeloY;
+         (dist.f[dMM0])[ksw] = getInterpolatedDistributionForVeloBC(q, f_NE, f_SW, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dMM0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = -vx1 - vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX - VeloY;
+         (dist.f[dPP0])[kne] = getInterpolatedDistributionForVeloBC(q, f_SW, f_NE, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dPM0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = vx1 - vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX - VeloY;
+         (dist.f[dMP0])[knw] = getInterpolatedDistributionForVeloBC(q, f_SE, f_NW, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dMP0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = -vx1 + vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX + VeloY;
+         (dist.f[dPM0])[kse] = getInterpolatedDistributionForVeloBC(q, f_NW, f_SE, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dP0P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx1 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX + VeloZ;
+         (dist.f[dM0M])[kbw] = getInterpolatedDistributionForVeloBC(q, f_TE, f_BW, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dM0M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+        VeloX = slipLength*vx1;
+        VeloZ = slipLength*vx3;
+        if (x == true) VeloX = c0o1;
+        if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx1 - vx3;
+        feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX - VeloZ;
+         (dist.f[dP0P])[kte] = getInterpolatedDistributionForVeloBC(q, f_BW, f_TE, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dP0M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx1 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX - VeloZ;
+         (dist.f[dM0P])[ktw] = getInterpolatedDistributionForVeloBC(q, f_BE, f_TW, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dM0P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx1 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX + VeloZ;
+         (dist.f[dP0M])[kbe] = getInterpolatedDistributionForVeloBC(q, f_TW, f_BE, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0PP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloY + VeloZ;
+         (dist.f[d0MM])[kbs] = getInterpolatedDistributionForVeloBC(q, f_TN, f_BS, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0MM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloY - VeloZ;
+         (dist.f[d0PP])[ktn] = getInterpolatedDistributionForVeloBC(q, f_BS, f_TN, feq, omega, velocityBC, c1o54);
+      }
+
+
+      q = (subgridD.q[d0PM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloY - VeloZ;
+         (dist.f[d0MP])[kts] = getInterpolatedDistributionForVeloBC(q, f_BN, f_TS, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0MP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloY + VeloZ;
+         (dist.f[d0PM])[kbn] = getInterpolatedDistributionForVeloBC(q, f_TS, f_BN, feq, omega, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dPPP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 + vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX + VeloY + VeloZ;
+         (dist.f[dMMM])[kbsw] = getInterpolatedDistributionForVeloBC(q, f_TNE, f_BSW, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMMM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 - vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX - VeloY - VeloZ;
+         (dist.f[dPPP])[ktne] = getInterpolatedDistributionForVeloBC(q, f_BSW, f_TNE, feq, omega, velocityBC, c1o216);
+      }
+
+
+      q = (subgridD.q[dPPM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 + vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX + VeloY - VeloZ;
+         (dist.f[dMMP])[ktsw] = getInterpolatedDistributionForVeloBC(q, f_BNE, f_TSW, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMMP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 - vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX - VeloY + VeloZ;
+         (dist.f[dPPM])[kbne] = getInterpolatedDistributionForVeloBC(q, f_TSW, f_BNE, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dPMP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 - vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX - VeloY + VeloZ;
+         (dist.f[dMPM])[kbnw] = getInterpolatedDistributionForVeloBC(q, f_TSE, f_BNW, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMPM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 + vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX + VeloY - VeloZ;
+         (dist.f[dPMP])[ktse] = getInterpolatedDistributionForVeloBC(q, f_BNW, f_TSE, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dPMM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 - vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX - VeloY - VeloZ;
+         (dist.f[dMPP])[ktnw] = getInterpolatedDistributionForVeloBC(q, f_BSE, f_TNW, feq, omega, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMPP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 + vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX + VeloY + VeloZ;
+         (dist.f[dPMM])[kbse] = getInterpolatedDistributionForVeloBC(q, f_TNW, f_BSE, feq, omega, velocityBC, c1o216);
+      }
+   }
+}
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/core/BoundaryConditions/Slip/SlipTurbulentViscosityCompressible.cu b/src/gpu/core/BoundaryConditions/Slip/SlipTurbulentViscosityCompressible.cu
new file mode 100644
index 0000000000000000000000000000000000000000..03edb52bf7b85397c71c9ed1203ea813a91872e7
--- /dev/null
+++ b/src/gpu/core/BoundaryConditions/Slip/SlipTurbulentViscosityCompressible.cu
@@ -0,0 +1,550 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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 SlipBCs27.cu
+//! \ingroup GPU
+//! \author Martin Schoenherr, Anna Wellmann
+//======================================================================================
+#include "LBM/LB.h" 
+#include "lbm/constants/D3Q27.h"
+#include "basics/constants/NumericConstants.h"
+#include "LBM/GPUHelperFunctions/KernelUtilities.h"
+
+using namespace vf::basics::constant;
+using namespace vf::lbm::dir;
+using namespace vf::gpu;
+
+__global__ void SlipTurbulentViscosityCompressible_Device(
+    real* distributions, 
+    int* subgridDistanceIndices, 
+    real* subgridDistances,
+    unsigned int numberOfBCnodes,
+    real omega, 
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* turbViscosity,
+    unsigned long long numberOfLBnodes, 
+    bool isEvenTimestep)
+{
+   //! The slip boundary condition is executed in the following steps
+   //!
+
+   ////////////////////////////////////////////////////////////////////////////////
+   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
+   //!
+   const unsigned nodeIndex = getNodeIndex();
+
+   if(nodeIndex < numberOfBCnodes)
+   {
+      //////////////////////////////////////////////////////////////////////////
+      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
+      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
+      //!
+      Distributions27 dist;
+      getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
+      
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set local subgrid distances (q's)
+      //!
+      SubgridDistances27 subgridD;
+      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
+      
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set neighbor indices (necessary for indirect addressing)
+      //!
+      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
+      unsigned int kzero= indexOfBCnode;
+      unsigned int ke   = indexOfBCnode;
+      unsigned int kw   = neighborX[indexOfBCnode];
+      unsigned int kn   = indexOfBCnode;
+      unsigned int ks   = neighborY[indexOfBCnode];
+      unsigned int kt   = indexOfBCnode;
+      unsigned int kb   = neighborZ[indexOfBCnode];
+      unsigned int ksw  = neighborY[kw];
+      unsigned int kne  = indexOfBCnode;
+      unsigned int kse  = ks;
+      unsigned int knw  = kw;
+      unsigned int kbw  = neighborZ[kw];
+      unsigned int kte  = indexOfBCnode;
+      unsigned int kbe  = kb;
+      unsigned int ktw  = kw;
+      unsigned int kbs  = neighborZ[ks];
+      unsigned int ktn  = indexOfBCnode;
+      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 = indexOfBCnode;
+      unsigned int kbsw = neighborZ[ksw];
+      
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Set local distributions
+      //!
+      real f_W    = (dist.f[dP00])[ke   ];
+      real f_E    = (dist.f[dM00])[kw   ];
+      real f_S    = (dist.f[d0P0])[kn   ];
+      real f_N    = (dist.f[d0M0])[ks   ];
+      real f_B    = (dist.f[d00P])[kt   ];
+      real f_T    = (dist.f[d00M])[kb   ];
+      real f_SW   = (dist.f[dPP0])[kne  ];
+      real f_NE   = (dist.f[dMM0])[ksw  ];
+      real f_NW   = (dist.f[dPM0])[kse  ];
+      real f_SE   = (dist.f[dMP0])[knw  ];
+      real f_BW   = (dist.f[dP0P])[kte  ];
+      real f_TE   = (dist.f[dM0M])[kbw  ];
+      real f_TW   = (dist.f[dP0M])[kbe  ];
+      real f_BE   = (dist.f[dM0P])[ktw  ];
+      real f_BS   = (dist.f[d0PP])[ktn  ];
+      real f_TN   = (dist.f[d0MM])[kbs  ];
+      real f_TS   = (dist.f[d0PM])[kbn  ];
+      real f_BN   = (dist.f[d0MP])[kts  ];
+      real f_BSW  = (dist.f[dPPP])[ktne ];
+      real f_BNE  = (dist.f[dMMP])[ktsw ];
+      real f_BNW  = (dist.f[dPMP])[ktse ];
+      real f_BSE  = (dist.f[dMPP])[ktnw ];
+      real f_TSW  = (dist.f[dPPM])[kbne ];
+      real f_TNE  = (dist.f[dMMM])[kbsw ];
+      real f_TNW  = (dist.f[dPMM])[kbse ];
+      real f_TSE  = (dist.f[dMPM])[kbnw ];
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Calculate macroscopic quantities
+      //!
+      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
+                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
+                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
+
+      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
+                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
+                   (f_E - f_W)) / (c1o1 + drho);
+
+      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
+                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
+                   (f_N - f_S)) / (c1o1 + drho);
+
+      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
+                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
+                   (f_T - f_B)) / (c1o1 + drho);
+
+      real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - change the pointer to write the results in the correct array
+      //!
+      getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - compute local relaxation rate
+      //!
+      real om_turb = omega / (c1o1 + c3o1* omega* max(c0o1, turbViscosity[indexOfBCnode]) );
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Multiply the local velocities by the slipLength
+      //!
+      real slipLength = c1o1;
+      real VeloX = slipLength*vx1;
+      real VeloY = slipLength*vx2;
+      real VeloZ = slipLength*vx3;
+
+      ////////////////////////////////////////////////////////////////////////////////
+      //! - Update distributions with subgrid distance (q) between zero and one
+      //!
+      real feq, q, velocityLB, velocityBC;
+
+      bool x = false;
+      bool y = false;
+      bool z = false;
+
+      q = (subgridD.q[dP00])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
+      {
+         VeloX = c0o1;
+         x = true;
+
+         velocityLB = vx1;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloX;
+         (dist.f[dM00])[kw] = getInterpolatedDistributionForVeloBC(q, f_E, f_W, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[dM00])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = c0o1;
+         x = true;
+
+         velocityLB = -vx1;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloX;
+         (dist.f[dP00])[ke] = getInterpolatedDistributionForVeloBC(q, f_W, f_E, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d0P0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = c0o1;
+         y = true;
+
+         velocityLB = vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloY;
+         (dist.f[d0M0])[ks] = getInterpolatedDistributionForVeloBC(q, f_N, f_S, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d0M0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = c0o1;
+         y = true;
+
+         velocityLB = -vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloY;
+         (dist.f[d0P0])[kn] = getInterpolatedDistributionForVeloBC(q, f_S, f_N, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d00P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloZ = c0o1;
+         z = true;
+
+         velocityLB = vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = VeloZ;
+         (dist.f[d00M])[kb] = getInterpolatedDistributionForVeloBC(q, f_T, f_B, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[d00M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloZ = c0o1;
+         z = true;
+
+         velocityLB = -vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
+         velocityBC = -VeloZ;
+         (dist.f[d00P])[kt] = getInterpolatedDistributionForVeloBC(q, f_B, f_T, feq, om_turb, velocityBC, c2o27);
+      }
+
+      q = (subgridD.q[dPP0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = vx1 + vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX + VeloY;
+         (dist.f[dMM0])[ksw] = getInterpolatedDistributionForVeloBC(q, f_NE, f_SW, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dMM0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = -vx1 - vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX - VeloY;
+         (dist.f[dPP0])[kne] = getInterpolatedDistributionForVeloBC(q, f_SW, f_NE, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dPM0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = vx1 - vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX - VeloY;
+         (dist.f[dMP0])[knw] = getInterpolatedDistributionForVeloBC(q, f_SE, f_NW, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dMP0])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+
+         velocityLB = -vx1 + vx2;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX + VeloY;
+         (dist.f[dPM0])[kse] = getInterpolatedDistributionForVeloBC(q, f_NW, f_SE, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dP0P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx1 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX + VeloZ;
+         (dist.f[dM0M])[kbw] = getInterpolatedDistributionForVeloBC(q, f_TE, f_BW, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dM0M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+        VeloX = slipLength*vx1;
+        VeloZ = slipLength*vx3;
+        if (x == true) VeloX = c0o1;
+        if (z == true) VeloZ = c0o1;
+
+        velocityLB = -vx1 - vx3;
+        feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+        velocityBC = -VeloX - VeloZ;
+        (dist.f[dP0P])[kte] = getInterpolatedDistributionForVeloBC(q, f_BW, f_TE, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dP0M])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx1 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloX - VeloZ;
+         (dist.f[dM0P])[ktw] = getInterpolatedDistributionForVeloBC(q, f_BE, f_TW, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dM0P])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx1 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloX + VeloZ;
+         (dist.f[dP0M])[kbe] = getInterpolatedDistributionForVeloBC(q, f_TW, f_BE, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0PP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloY + VeloZ;
+         (dist.f[d0MM])[kbs] = getInterpolatedDistributionForVeloBC(q, f_TN, f_BS, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0MM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloY - VeloZ;
+         (dist.f[d0PP])[ktn] = getInterpolatedDistributionForVeloBC(q, f_BS, f_TN, feq, om_turb, velocityBC, c1o54);
+      }
+
+
+      q = (subgridD.q[d0PM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = VeloY - VeloZ;
+         (dist.f[d0MP])[kts] = getInterpolatedDistributionForVeloBC(q, f_BN, f_TS, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[d0MP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+
+         velocityLB = -vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
+         velocityBC = -VeloY + VeloZ;
+         (dist.f[d0PM])[kbn] = getInterpolatedDistributionForVeloBC(q, f_TS, f_BN, feq, om_turb, velocityBC, c1o54);
+      }
+
+      q = (subgridD.q[dPPP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 + vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX + VeloY + VeloZ;
+         (dist.f[dMMM])[kbsw] = getInterpolatedDistributionForVeloBC(q, f_TNE, f_BSW, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMMM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 - vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX - VeloY - VeloZ;
+         (dist.f[dPPP])[ktne] = getInterpolatedDistributionForVeloBC(q, f_BSW, f_TNE, feq, om_turb, velocityBC, c1o216);
+      }
+
+
+      q = (subgridD.q[dPPM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 + vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX + VeloY - VeloZ;
+         (dist.f[dMMP])[ktsw] = getInterpolatedDistributionForVeloBC(q, f_BNE, f_TSW, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMMP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 - vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX - VeloY + VeloZ;
+         (dist.f[dPPM])[kbne] = getInterpolatedDistributionForVeloBC(q, f_TSW, f_BNE, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dPMP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 - vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX - VeloY + VeloZ;
+         (dist.f[dMPM])[kbnw] = getInterpolatedDistributionForVeloBC(q, f_TSE, f_BNW, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMPM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 + vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX + VeloY - VeloZ;
+         (dist.f[dPMP])[ktse] = getInterpolatedDistributionForVeloBC(q, f_BNW, f_TSE, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dPMM])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = vx1 - vx2 - vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = VeloX - VeloY - VeloZ;
+         (dist.f[dMPP])[ktnw] = getInterpolatedDistributionForVeloBC(q, f_BSE, f_TNW, feq, om_turb, velocityBC, c1o216);
+      }
+
+      q = (subgridD.q[dMPP])[nodeIndex];
+      if (q>=c0o1 && q<=c1o1)
+      {
+         VeloX = slipLength*vx1;
+         VeloY = slipLength*vx2;
+         VeloZ = slipLength*vx3;
+         if (x == true) VeloX = c0o1;
+         if (y == true) VeloY = c0o1;
+         if (z == true) VeloZ = c0o1;
+         velocityLB = -vx1 + vx2 + vx3;
+         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
+         velocityBC = -VeloX + VeloY + VeloZ;
+         (dist.f[dPMM])[kbse] = getInterpolatedDistributionForVeloBC(q, f_TNW, f_BSE, feq, om_turb, velocityBC, c1o216);
+      }
+   }
+}
diff --git a/src/gpu/core/BoundaryConditions/Slip/Slip_Device.cuh b/src/gpu/core/BoundaryConditions/Slip/Slip_Device.cuh
new file mode 100644
index 0000000000000000000000000000000000000000..91dd365bf9cddd6280d5f5a38ee7654872661599
--- /dev/null
+++ b/src/gpu/core/BoundaryConditions/Slip/Slip_Device.cuh
@@ -0,0 +1,61 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
+//      \    \  |    |   ________________________________________________________________
+//       \    \ |    |  |  ______________________________________________________________|
+//        \    \|    |  |  |         __          __     __     __     ______      _______
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
+//
+//  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/>.
+//
+//! \author Martin Schoenherr
+//=======================================================================================
+#ifndef Slip_Device_H
+#define Slip_Device_H
+
+#include "LBM/LB.h"
+
+__global__ void SlipCompressible_Device(
+    real* DD,
+    int* k_Q,
+    real* QQ,
+    unsigned int numberOfBCnodes,
+    real om1,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
+
+__global__ void SlipTurbulentViscosityCompressible_Device(
+    real* distributions,
+    int* subgridDistanceIndices,
+    real* subgridDistances,
+    unsigned int numberOfBCnodes,
+    real omega,
+    unsigned int* neighborX,
+    unsigned int* neighborY,
+    unsigned int* neighborZ,
+    real* turbViscosity,
+    unsigned long long numberOfLBnodes,
+    bool isEvenTimestep);
+
+#endif
diff --git a/src/gpu/core/GPU/GPU_Interface.h b/src/gpu/core/GPU/GPU_Interface.h
index e6825d7b0494e2bfdf8808f300688b46d48dea0f..2823ae42dd440850b77c74b891473b96cd1569fa 100644
--- a/src/gpu/core/GPU/GPU_Interface.h
+++ b/src/gpu/core/GPU/GPU_Interface.h
@@ -310,59 +310,6 @@ void LBCalcMeasurePoints27(real* vxMP,
                                       unsigned int numberOfThreads, 
                                       bool isEvenTimestep);
 
-void BcPress27(int nx, 
-                          int ny, 
-                          int tz, 
-                          unsigned int grid_nx, 
-                          unsigned int grid_ny, 
-                          unsigned int* bcMatD, 
-                          unsigned int* neighborX,
-                          unsigned int* neighborY,
-                          unsigned int* neighborZ,
-                          real* DD, 
-                          unsigned long long numberOfLBnodes, 
-                          bool isEvenTimestep);
-
-void QSlipDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
-
-void QSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
-
-void BBSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
-
-void QSlipDevCompTurbulentViscosity27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
-
-void QSlipPressureDevCompTurbulentViscosity27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
-
-void QSlipGeomDevComp27( unsigned int numberOfThreads,
-                                    real* DD, 
-                                    int* k_Q, 
-                                    real* QQ,
-                                    unsigned int numberOfBCnodes,
-                                    real om1, 
-                                    real* NormalX,
-                                    real* NormalY,
-                                    real* NormalZ,
-                                    unsigned int* neighborX,
-                                    unsigned int* neighborY,
-                                    unsigned int* neighborZ,
-                                    unsigned long long numberOfLBnodes, 
-                                    bool isEvenTimestep);
-
-void QSlipNormDevComp27(unsigned int numberOfThreads,
-                                   real* DD, 
-                                   int* k_Q, 
-                                   real* QQ,
-                                   unsigned int numberOfBCnodes,
-                                   real om1, 
-                                   real* NormalX,
-                                   real* NormalY,
-                                   real* NormalZ,
-                                   unsigned int* neighborX,
-                                   unsigned int* neighborY,
-                                   unsigned int* neighborZ,
-                                   unsigned long long numberOfLBnodes, 
-                                   bool isEvenTimestep);
-
 void QStressDevComp27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level);
 
 void BBStressDev27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level);
diff --git a/src/gpu/core/GPU/GPU_Kernels.cuh b/src/gpu/core/GPU/GPU_Kernels.cuh
index 842edadf9c605f707f81c19886b86309d7bb07cf..808860cd353fb85553599b91b8d21e8b350b60e5 100644
--- a/src/gpu/core/GPU/GPU_Kernels.cuh
+++ b/src/gpu/core/GPU/GPU_Kernels.cuh
@@ -271,94 +271,6 @@ __global__ void LBCalcMeasurePoints(real* vxMP,
                                                real* DD,
                                                bool isEvenTimestep);
 
-//Slip BCs
-__global__ void QSlipDevice27(real* DD,
-                                         int* k_Q,
-                                         real* QQ,
-                                         unsigned int numberOfBCnodes,
-                                         real om1,
-                                         unsigned int* neighborX,
-                                         unsigned int* neighborY,
-                                         unsigned int* neighborZ,
-                                         unsigned long long numberOfLBnodes,
-                                         bool isEvenTimestep);
-
-__global__ void QSlipDeviceComp27(real* DD,
-                                             int* k_Q,
-                                             real* QQ,
-                                             unsigned int numberOfBCnodes,
-                                             real om1,
-                                             unsigned int* neighborX,
-                                             unsigned int* neighborY,
-                                             unsigned int* neighborZ,
-                                             unsigned long long numberOfLBnodes,
-                                             bool isEvenTimestep);
-
-__global__ void QSlipDeviceComp27TurbViscosity(
-                                    real* distributions,
-                                    int* subgridDistanceIndices,
-                                    real* subgridDistances,
-                                    unsigned int numberOfBCnodes,
-                                    real omega,
-                                    unsigned int* neighborX,
-                                    unsigned int* neighborY,
-                                    unsigned int* neighborZ,
-                                    real* turbViscosity,
-                                    unsigned long long numberOfLBnodes,
-                                    bool isEvenTimestep);
-
-__global__ void QSlipPressureDeviceComp27TurbViscosity(
-                                    real* distributions,
-                                    int* subgridDistanceIndices,
-                                    real* subgridDistances,
-                                    unsigned int numberOfBCnodes,
-                                    real omega,
-                                    unsigned int* neighborX,
-                                    unsigned int* neighborY,
-                                    unsigned int* neighborZ,
-                                    real* turbViscosity,
-                                    unsigned long long numberOfLBnodes,
-                                    bool isEvenTimestep);
-
-__global__ void QSlipGeomDeviceComp27(real* DD,
-                                                 int* k_Q,
-                                                 real* QQ,
-                                                 unsigned int numberOfBCnodes,
-                                                 real om1,
-                                                 real* NormalX,
-                                                 real* NormalY,
-                                                 real* NormalZ,
-                                                 unsigned int* neighborX,
-                                                 unsigned int* neighborY,
-                                                 unsigned int* neighborZ,
-                                                 unsigned long long numberOfLBnodes,
-                                                 bool isEvenTimestep);
-
-__global__ void QSlipNormDeviceComp27(real* DD,
-                                                 int* k_Q,
-                                                 real* QQ,
-                                                 unsigned int numberOfBCnodes,
-                                                 real om1,
-                                                 real* NormalX,
-                                                 real* NormalY,
-                                                 real* NormalZ,
-                                                 unsigned int* neighborX,
-                                                 unsigned int* neighborY,
-                                                 unsigned int* neighborZ,
-                                                 unsigned long long numberOfLBnodes,
-                                                 bool isEvenTimestep);
-
-__global__ void BBSlipDeviceComp27(
-    real* distributions,
-    int* subgridDistanceIndices,
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes,
-    bool isEvenTimestep);
-
 // Stress BCs (wall model)
 __global__ void QStressDeviceComp27(real* DD,
                                                int* k_Q,
diff --git a/src/gpu/core/GPU/LBMKernel.cu b/src/gpu/core/GPU/LBMKernel.cu
index 501fdc5bb220c5f33dca7ec20105ba377b39b0b4..df9a99dcc58696c3cfebdc48508de19ae4335f22 100644
--- a/src/gpu/core/GPU/LBMKernel.cu
+++ b/src/gpu/core/GPU/LBMKernel.cu
@@ -1216,172 +1216,6 @@ void QADPressIncompDev27(
     getLastCudaError("QADPressIncomp27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-void QSlipDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
-{
-    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-    QSlipDevice27<<< grid, threads >>> (
-        parameterDevice->distributions.f[0],
-        boundaryCondition->k,
-        boundaryCondition->q27[0],
-        boundaryCondition->numberOfBCnodes,
-        parameterDevice->omega,
-        parameterDevice->neighborX,
-        parameterDevice->neighborY,
-        parameterDevice->neighborZ,
-        parameterDevice->numberOfNodes,
-        parameterDevice->isEvenTimestep);
-    getLastCudaError("QSlipDevice27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QSlipDevCompTurbulentViscosity27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
-{
-    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-    QSlipDeviceComp27TurbViscosity<<< grid, threads >>> (
-        parameterDevice->distributions.f[0],
-        boundaryCondition->k,
-        boundaryCondition->q27[0],
-        boundaryCondition->numberOfBCnodes,
-        parameterDevice->omega,
-        parameterDevice->neighborX,
-        parameterDevice->neighborY,
-        parameterDevice->neighborZ,
-        parameterDevice->turbViscosity,
-        parameterDevice->numberOfNodes,
-        parameterDevice->isEvenTimestep);
-    getLastCudaError("QSlipDeviceComp27TurbViscosity execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QSlipPressureDevCompTurbulentViscosity27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
-{
-    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-    QSlipPressureDeviceComp27TurbViscosity<<< grid, threads >>> (
-        parameterDevice->distributions.f[0],
-        boundaryCondition->k,
-        boundaryCondition->q27[0],
-        boundaryCondition->numberOfBCnodes,
-        parameterDevice->omega,
-        parameterDevice->neighborX,
-        parameterDevice->neighborY,
-        parameterDevice->neighborZ,
-        parameterDevice->turbViscosity,
-        parameterDevice->numberOfNodes,
-        parameterDevice->isEvenTimestep);
-    getLastCudaError("QSlipDeviceComp27TurbViscosity execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
-{
-    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-    QSlipDeviceComp27<<< grid, threads >>> (
-        parameterDevice->distributions.f[0],
-        boundaryCondition->k,
-        boundaryCondition->q27[0],
-        boundaryCondition->numberOfBCnodes,
-        parameterDevice->omega,
-        parameterDevice->neighborX,
-        parameterDevice->neighborY,
-        parameterDevice->neighborZ,
-        parameterDevice->numberOfNodes,
-        parameterDevice->isEvenTimestep);
-    getLastCudaError("QSlipDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void BBSlipDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
-{
-    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads, boundaryCondition->numberOfBCnodes);
-    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
-
-    BBSlipDeviceComp27<<< grid, threads >>> (
-        parameterDevice->distributions.f[0],
-        boundaryCondition->k,
-        boundaryCondition->q27[0],
-        boundaryCondition->numberOfBCnodes,
-        parameterDevice->neighborX,
-        parameterDevice->neighborY,
-        parameterDevice->neighborZ,
-        parameterDevice->numberOfNodes,
-        parameterDevice->isEvenTimestep);
-    getLastCudaError("BBSlipDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QSlipGeomDevComp27(
-    unsigned int numberOfThreads,
-    real* DD,
-    int* k_Q,
-    real* QQ,
-    unsigned int numberOfBCnodes,
-    real om1,
-    real* NormalX,
-    real* NormalY,
-    real* NormalZ,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes,
-    bool isEvenTimestep)
-{
-    vf::cuda::CudaGrid grid(numberOfThreads, numberOfBCnodes);
-
-    QSlipGeomDeviceComp27<<< grid.grid, grid.threads >>> (
-        DD,
-        k_Q,
-        QQ,
-        numberOfBCnodes,
-        om1,
-        NormalX,
-        NormalY,
-        NormalZ,
-        neighborX,
-        neighborY,
-        neighborZ,
-        numberOfLBnodes,
-        isEvenTimestep);
-    getLastCudaError("QSlipGeomDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
-void QSlipNormDevComp27(
-    unsigned int numberOfThreads,
-    real* DD,
-    int* k_Q,
-    real* QQ,
-    unsigned int numberOfBCnodes,
-    real om1,
-    real* NormalX,
-    real* NormalY,
-    real* NormalZ,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes,
-    bool isEvenTimestep)
-{
-    vf::cuda::CudaGrid grid = vf::cuda::CudaGrid(numberOfThreads, numberOfBCnodes);
-
-    QSlipNormDeviceComp27<<< grid.grid, grid.threads >>> (
-        DD,
-        k_Q,
-        QQ,
-        numberOfBCnodes,
-        om1,
-        NormalX,
-        NormalY,
-        NormalZ,
-        neighborX,
-        neighborY,
-        neighborZ,
-        numberOfLBnodes,
-        isEvenTimestep);
-    getLastCudaError("QSlipNormDeviceComp27 execution failed");
-}
-//////////////////////////////////////////////////////////////////////////
 void QStressDevComp27(Parameter *para,  QforBoundaryConditions* boundaryCondition, const int level)
 {
     dim3 grid = vf::cuda::getCudaGrid(  para->getParD(level)->numberofthreads, boundaryCondition->numberOfBCnodes);
diff --git a/src/gpu/core/GPU/SlipBCs27.cu b/src/gpu/core/GPU/SlipBCs27.cu
deleted file mode 100644
index 71d36ffd50cb4eaf010e6fef2f1d7e79f31e5eb2..0000000000000000000000000000000000000000
--- a/src/gpu/core/GPU/SlipBCs27.cu
+++ /dev/null
@@ -1,5102 +0,0 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  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 SlipBCs27.cu
-//! \ingroup GPU
-//! \author Martin Schoenherr, Anna Wellmann
-//======================================================================================
-#include "LBM/LB.h" 
-#include "lbm/constants/D3Q27.h"
-#include "basics/constants/NumericConstants.h"
-#include "LBM/GPUHelperFunctions/KernelUtilities.h"
-
-using namespace vf::basics::constant;
-using namespace vf::lbm::dir;
-using namespace vf::gpu;
-
-//////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipDevice27(
-    real* DD, 
-    int* k_Q, 
-    real* QQ,
-    unsigned int numberOfBCnodes,
-    real om1, 
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   Distributions27 D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, isEvenTimestep);
-
-   ////////////////////////////////////////////////////////////////////////////////
-   const unsigned  x = threadIdx.x;  // Globaler x-Index 
-   const unsigned  y = blockIdx.x;   // Globaler y-Index 
-   const unsigned  z = blockIdx.y;   // Globaler z-Index 
-
-   const unsigned nx = blockDim.x;
-   const unsigned ny = gridDim.x;
-
-   const unsigned k = nx*(ny*z + y) + x;
-   //////////////////////////////////////////////////////////////////////////
-
-   if(k<numberOfBCnodes)
-   {
-      ////////////////////////////////////////////////////////////////////////////////
-      real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
-            *q_dirNE,  *q_dirSW,  *q_dirSE,  *q_dirNW,  *q_dirTE,  *q_dirBW,
-            *q_dirBE,  *q_dirTW,  *q_dirTN,  *q_dirBS,  *q_dirBN,  *q_dirTS,
-            *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
-            *q_dirBSE, *q_dirBNW; 
-      q_dirE   = &QQ[dP00 * numberOfBCnodes];
-      q_dirW   = &QQ[dM00 * numberOfBCnodes];
-      q_dirN   = &QQ[d0P0 * numberOfBCnodes];
-      q_dirS   = &QQ[d0M0 * numberOfBCnodes];
-      q_dirT   = &QQ[d00P * numberOfBCnodes];
-      q_dirB   = &QQ[d00M * numberOfBCnodes];
-      q_dirNE  = &QQ[dPP0 * numberOfBCnodes];
-      q_dirSW  = &QQ[dMM0 * numberOfBCnodes];
-      q_dirSE  = &QQ[dPM0 * numberOfBCnodes];
-      q_dirNW  = &QQ[dMP0 * numberOfBCnodes];
-      q_dirTE  = &QQ[dP0P * numberOfBCnodes];
-      q_dirBW  = &QQ[dM0M * numberOfBCnodes];
-      q_dirBE  = &QQ[dP0M * numberOfBCnodes];
-      q_dirTW  = &QQ[dM0P * numberOfBCnodes];
-      q_dirTN  = &QQ[d0PP * numberOfBCnodes];
-      q_dirBS  = &QQ[d0MM * numberOfBCnodes];
-      q_dirBN  = &QQ[d0PM * numberOfBCnodes];
-      q_dirTS  = &QQ[d0MP * numberOfBCnodes];
-      q_dirTNE = &QQ[dPPP * numberOfBCnodes];
-      q_dirTSW = &QQ[dMMP * numberOfBCnodes];
-      q_dirTSE = &QQ[dPMP * numberOfBCnodes];
-      q_dirTNW = &QQ[dMPP * numberOfBCnodes];
-      q_dirBNE = &QQ[dPPM * numberOfBCnodes];
-      q_dirBSW = &QQ[dMMM * numberOfBCnodes];
-      q_dirBSE = &QQ[dPMM * numberOfBCnodes];
-      q_dirBNW = &QQ[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      //index
-      unsigned int KQK  = k_Q[k];
-      unsigned int kzero= KQK;
-      unsigned int ke   = KQK;
-      unsigned int kw   = neighborX[KQK];
-      unsigned int kn   = KQK;
-      unsigned int ks   = neighborY[KQK];
-      unsigned int kt   = KQK;
-      unsigned int kb   = neighborZ[KQK];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = KQK;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = KQK;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = KQK;
-      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 = KQK;
-      unsigned int kbsw = neighborZ[ksw];
-      ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[dP00])[ke   ];
-      real f_E    = (D.f[dM00])[kw   ];
-      real f_S    = (D.f[d0P0])[kn   ];
-      real f_N    = (D.f[d0M0])[ks   ];
-      real f_B    = (D.f[d00P])[kt   ];
-      real f_T    = (D.f[d00M])[kb   ];
-      real f_SW   = (D.f[dPP0])[kne  ];
-      real f_NE   = (D.f[dMM0])[ksw  ];
-      real f_NW   = (D.f[dPM0])[kse  ];
-      real f_SE   = (D.f[dMP0])[knw  ];
-      real f_BW   = (D.f[dP0P])[kte  ];
-      real f_TE   = (D.f[dM0M])[kbw  ];
-      real f_TW   = (D.f[dP0M])[kbe  ];
-      real f_BE   = (D.f[dM0P])[ktw  ];
-      real f_BS   = (D.f[d0PP])[ktn  ];
-      real f_TN   = (D.f[d0MM])[kbs  ];
-      real f_TS   = (D.f[d0PM])[kbn  ];
-      real f_BN   = (D.f[d0MP])[kts  ];
-      real f_BSW  = (D.f[dPPP])[ktne ];
-      real f_BNE  = (D.f[dMMP])[ktsw ];
-      real f_BNW  = (D.f[dPMP])[ktse ];
-      real f_BSE  = (D.f[dMPP])[ktnw ];
-      real f_TSW  = (D.f[dPPM])[kbne ];
-      real f_TNE  = (D.f[dMMM])[kbsw ];
-      real f_TNW  = (D.f[dPMM])[kbse ];
-      real f_TSE  = (D.f[dMPM])[kbnw ];
-      ////////////////////////////////////////////////////////////////////////////////
-      real vx1, vx2, vx3, drho, feq, q;
-      drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[d000])[kzero]); 
-
-      vx1    =  ((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                (f_E - f_W); 
-         
-
-      vx2    =   (-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                 ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                 (f_N - f_S); 
-
-      vx3    =   ((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                 (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                 (f_T - f_B); 
-
-      real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3);
-
-      //////////////////////////////////////////////////////////////////////////
-
-      D = vf::gpu::getDistributionReferences27(DD, numberOfLBnodes, !isEvenTimestep);
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //Test
-      //(D.f[d000])[k]=c1o10;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real fac = c1o1;//c99o100;
-      real VeloX = fac*vx1;
-      real VeloY = fac*vx2;
-      real VeloZ = fac*vx3;
-      bool x = false;
-      bool y = false;
-      bool z = false;
-
-      q = q_dirE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         x = true;
-         feq=c2o27* (drho+c3o1*( vx1        )+c9o2*( vx1        )*( vx1        )-cu_sq); 
-         (D.f[dM00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-feq*om1)/(c1o1-om1)+(q*(f_E+f_W)-c6o1*c2o27*( VeloX     ))/(c1o1+q);
-         //(D.f[dM00])[kw]=zero;
-      }
-
-      q = q_dirW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         x = true;
-         feq=c2o27* (drho+c3o1*(-vx1        )+c9o2*(-vx1        )*(-vx1        )-cu_sq); 
-         (D.f[dP00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-feq*om1)/(c1o1-om1)+(q*(f_W+f_E)-c6o1*c2o27*(-VeloX     ))/(c1o1+q);
-         //(D.f[dP00])[ke]=zero;
-      }
-
-      q = q_dirN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = c0o1;
-         VeloZ = fac*vx3;
-         y = true;
-         feq=c2o27* (drho+c3o1*(    vx2     )+c9o2*(     vx2    )*(     vx2    )-cu_sq); 
-         (D.f[d0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-feq*om1)/(c1o1-om1)+(q*(f_N+f_S)-c6o1*c2o27*( VeloY     ))/(c1o1+q);
-         //(D.f[d0M0])[ks]=zero;
-      }
-
-      q = q_dirS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = c0o1;
-         VeloZ = fac*vx3;
-         y = true;
-         feq=c2o27* (drho+c3o1*(   -vx2     )+c9o2*(    -vx2    )*(    -vx2    )-cu_sq); 
-         (D.f[d0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-feq*om1)/(c1o1-om1)+(q*(f_S+f_N)-c6o1*c2o27*(-VeloY     ))/(c1o1+q);
-         //(D.f[d0P0])[kn]=zero;
-      }
-
-      q = q_dirT[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = c0o1;
-         z = true;
-         feq=c2o27* (drho+c3o1*(         vx3)+c9o2*(         vx3)*(         vx3)-cu_sq); 
-         (D.f[d00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-feq*om1)/(c1o1-om1)+(q*(f_T+f_B)-c6o1*c2o27*( VeloZ     ))/(c1o1+q);
-         //(D.f[d00M])[kb]=one;
-      }
-
-      q = q_dirB[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = c0o1;
-         z = true;
-         feq=c2o27* (drho+c3o1*(        -vx3)+c9o2*(        -vx3)*(        -vx3)-cu_sq); 
-         (D.f[d00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-feq*om1)/(c1o1-om1)+(q*(f_B+f_T)-c6o1*c2o27*(-VeloZ     ))/(c1o1+q);
-         //(D.f[d00P])[kt]=zero;
-      }
-
-      q = q_dirNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         feq=c1o54* (drho+c3o1*( vx1+vx2    )+c9o2*( vx1+vx2    )*( vx1+vx2    )-cu_sq); 
-         (D.f[dMM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-feq*om1)/(c1o1-om1)+(q*(f_NE+f_SW)-c6o1*c1o54*(VeloX+VeloY))/(c1o1+q);
-         //(D.f[dMM0])[ksw]=zero;
-      }
-
-      q = q_dirSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         feq=c1o54* (drho+c3o1*(-vx1-vx2    )+c9o2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq); 
-         (D.f[dPP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-feq*om1)/(c1o1-om1)+(q*(f_SW+f_NE)-c6o1*c1o54*(-VeloX-VeloY))/(c1o1+q);
-         //(D.f[dPP0])[kne]=zero;
-      }
-
-      q = q_dirSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         feq=c1o54* (drho+c3o1*( vx1-vx2    )+c9o2*( vx1-vx2    )*( vx1-vx2    )-cu_sq); 
-         (D.f[dMP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-feq*om1)/(c1o1-om1)+(q*(f_SE+f_NW)-c6o1*c1o54*( VeloX-VeloY))/(c1o1+q);
-         //(D.f[dMP0])[knw]=zero;
-      }
-
-      q = q_dirNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         feq=c1o54* (drho+c3o1*(-vx1+vx2    )+c9o2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq); 
-         (D.f[dPM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-feq*om1)/(c1o1-om1)+(q*(f_NW+f_SE)-c6o1*c1o54*(-VeloX+VeloY))/(c1o1+q);
-         //(D.f[dPM0])[kse]=zero;
-      }
-
-      q = q_dirTE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*( vx1    +vx3)+c9o2*( vx1    +vx3)*( vx1    +vx3)-cu_sq); 
-         (D.f[dM0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-feq*om1)/(c1o1-om1)+(q*(f_TE+f_BW)-c6o1*c1o54*( VeloX+VeloZ))/(c1o1+q);
-         //(D.f[dM0M])[kbw]=zero;
-      }
-
-      q = q_dirBW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(-vx1    -vx3)+c9o2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq); 
-         (D.f[dP0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-feq*om1)/(c1o1-om1)+(q*(f_BW+f_TE)-c6o1*c1o54*(-VeloX-VeloZ))/(c1o1+q);
-         //(D.f[dP0P])[kte]=zero;
-      }
-
-      q = q_dirBE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*( vx1    -vx3)+c9o2*( vx1    -vx3)*( vx1    -vx3)-cu_sq); 
-         (D.f[dM0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-feq*om1)/(c1o1-om1)+(q*(f_BE+f_TW)-c6o1*c1o54*( VeloX-VeloZ))/(c1o1+q);
-         //(D.f[dM0P])[ktw]=zero;
-      }
-
-      q = q_dirTW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(-vx1    +vx3)+c9o2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq); 
-         (D.f[dP0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-feq*om1)/(c1o1-om1)+(q*(f_TW+f_BE)-c6o1*c1o54*(-VeloX+VeloZ))/(c1o1+q);
-         //(D.f[dP0M])[kbe]=zero;
-      }
-
-      q = q_dirTN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(     vx2+vx3)+c9o2*(     vx2+vx3)*(     vx2+vx3)-cu_sq); 
-         (D.f[d0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-feq*om1)/(c1o1-om1)+(q*(f_TN+f_BS)-c6o1*c1o54*( VeloY+VeloZ))/(c1o1+q);
-         //(D.f[d0MM])[kbs]=zero;
-      }
-
-      q = q_dirBS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(    -vx2-vx3)+c9o2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq); 
-         (D.f[d0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-feq*om1)/(c1o1-om1)+(q*(f_BS+f_TN)-c6o1*c1o54*( -VeloY-VeloZ))/(c1o1+q);
-         //(D.f[d0PP])[ktn]=zero;
-      }
-
-      q = q_dirBN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(     vx2-vx3)+c9o2*(     vx2-vx3)*(     vx2-vx3)-cu_sq); 
-         (D.f[d0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-feq*om1)/(c1o1-om1)+(q*(f_BN+f_TS)-c6o1*c1o54*( VeloY-VeloZ))/(c1o1+q);
-         //(D.f[d0MP])[kts]=zero;
-      }
-
-      q = q_dirTS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o54* (drho+c3o1*(    -vx2+vx3)+c9o2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq); 
-         (D.f[d0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-feq*om1)/(c1o1-om1)+(q*(f_TS+f_BN)-c6o1*c1o54*( -VeloY+VeloZ))/(c1o1+q);
-         //(D.f[d0PM])[kbn]=zero;
-      }
-
-      q = q_dirTNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); 
-         (D.f[dMMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-feq*om1)/(c1o1-om1)+(q*(f_TNE+f_BSW)-c6o1*c1o216*( VeloX+VeloY+VeloZ))/(c1o1+q);
-         //(D.f[dMMM])[kbsw]=zero;
-      }
-
-      q = q_dirBSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); 
-         (D.f[dPPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-feq*om1)/(c1o1-om1)+(q*(f_BSW+f_TNE)-c6o1*c1o216*(-VeloX-VeloY-VeloZ))/(c1o1+q);
-         //(D.f[dPPP])[ktne]=zero;
-      }
-
-      q = q_dirBNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); 
-         (D.f[dMMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-feq*om1)/(c1o1-om1)+(q*(f_BNE+f_TSW)-c6o1*c1o216*( VeloX+VeloY-VeloZ))/(c1o1+q);
-         //(D.f[dMMP])[ktsw]=zero;
-      }
-
-      q = q_dirTSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); 
-         (D.f[dPPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-feq*om1)/(c1o1-om1)+(q*(f_TSW+f_BNE)-c6o1*c1o216*(-VeloX-VeloY+VeloZ))/(c1o1+q);
-         //(D.f[dPPM])[kbne]=zero;
-      }
-
-      q = q_dirTSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); 
-         (D.f[dMPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-feq*om1)/(c1o1-om1)+(q*(f_TSE+f_BNW)-c6o1*c1o216*( VeloX-VeloY+VeloZ))/(c1o1+q);
-         //(D.f[dMPM])[kbnw]=zero;
-      }
-
-      q = q_dirBNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); 
-         (D.f[dPMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-feq*om1)/(c1o1-om1)+(q*(f_BNW+f_TSE)-c6o1*c1o216*(-VeloX+VeloY-VeloZ))/(c1o1+q);
-         //(D.f[dPMP])[ktse]=zero;
-      }
-
-      q = q_dirBSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); 
-         (D.f[dMPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-feq*om1)/(c1o1-om1)+(q*(f_BSE+f_TNW)-c6o1*c1o216*( VeloX-VeloY-VeloZ))/(c1o1+q);
-         //(D.f[dMPP])[ktnw]=zero;
-      }
-
-      q = q_dirTNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = fac*vx1;
-         VeloY = fac*vx2;
-         VeloZ = fac*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         feq=c1o216*(drho+c3o1*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); 
-         (D.f[dPMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-feq*om1)/(c1o1-om1)+(q*(f_TNW+f_BSE)-c6o1*c1o216*(-VeloX+VeloY+VeloZ))/(c1o1+q);
-         //(D.f[dPMM])[kbse]=zero;
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipDeviceComp27(
-    real* distributions, 
-    int* subgridDistanceIndices, 
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    real omega, 
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   //! The slip boundary condition is executed in the following steps
-   //!
-
-   ////////////////////////////////////////////////////////////////////////////////
-   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
-   //!
-   const unsigned nodeIndex = getNodeIndex();
-
-   if(nodeIndex < numberOfBCnodes)
-   {
-      //////////////////////////////////////////////////////////////////////////
-      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
-      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
-      //!
-      Distributions27 dist;
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local subgrid distances (q's)
-      //!
-      SubgridDistances27 subgridD;
-      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set neighbor indices (necessary for indirect addressing)
-      //!
-      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
-      unsigned int kzero= indexOfBCnode;
-      unsigned int ke   = indexOfBCnode;
-      unsigned int kw   = neighborX[indexOfBCnode];
-      unsigned int kn   = indexOfBCnode;
-      unsigned int ks   = neighborY[indexOfBCnode];
-      unsigned int kt   = indexOfBCnode;
-      unsigned int kb   = neighborZ[indexOfBCnode];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = indexOfBCnode;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = indexOfBCnode;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = indexOfBCnode;
-      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 = indexOfBCnode;
-      unsigned int kbsw = neighborZ[ksw];
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local distributions
-      //!
-      real f_W    = (dist.f[dP00])[ke   ];
-      real f_E    = (dist.f[dM00])[kw   ];
-      real f_S    = (dist.f[d0P0])[kn   ];
-      real f_N    = (dist.f[d0M0])[ks   ];
-      real f_B    = (dist.f[d00P])[kt   ];
-      real f_T    = (dist.f[d00M])[kb   ];
-      real f_SW   = (dist.f[dPP0])[kne  ];
-      real f_NE   = (dist.f[dMM0])[ksw  ];
-      real f_NW   = (dist.f[dPM0])[kse  ];
-      real f_SE   = (dist.f[dMP0])[knw  ];
-      real f_BW   = (dist.f[dP0P])[kte  ];
-      real f_TE   = (dist.f[dM0M])[kbw  ];
-      real f_TW   = (dist.f[dP0M])[kbe  ];
-      real f_BE   = (dist.f[dM0P])[ktw  ];
-      real f_BS   = (dist.f[d0PP])[ktn  ];
-      real f_TN   = (dist.f[d0MM])[kbs  ];
-      real f_TS   = (dist.f[d0PM])[kbn  ];
-      real f_BN   = (dist.f[d0MP])[kts  ];
-      real f_BSW  = (dist.f[dPPP])[ktne ];
-      real f_BNE  = (dist.f[dMMP])[ktsw ];
-      real f_BNW  = (dist.f[dPMP])[ktse ];
-      real f_BSE  = (dist.f[dMPP])[ktnw ];
-      real f_TSW  = (dist.f[dPPM])[kbne ];
-      real f_TNE  = (dist.f[dMMM])[kbsw ];
-      real f_TNW  = (dist.f[dPMM])[kbse ];
-      real f_TSE  = (dist.f[dMPM])[kbnw ];
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Calculate macroscopic quantities
-      //!
-      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
-
-      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                   (f_E - f_W)) / (c1o1 + drho);
-
-      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                   (f_N - f_S)) / (c1o1 + drho);
-
-      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                   (f_T - f_B)) / (c1o1 + drho);
-
-      real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - change the pointer to write the results in the correct array
-      //!
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Multiply the local velocities by the slipLength
-      //!
-      real slipLength = c1o1;
-      real VeloX = slipLength*vx1;
-      real VeloY = slipLength*vx2;
-      real VeloZ = slipLength*vx3;
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Update distributions with subgrid distance (q) between zero and one
-      //!
-      real feq, q, velocityLB, velocityBC;
-
-      bool x = false;
-      bool y = false;
-      bool z = false;
-
-      q = (subgridD.q[dP00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloX;
-         (dist.f[dM00])[kw] = getInterpolatedDistributionForVeloBC(q, f_E, f_W, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dM00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = -vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloX;
-         (dist.f[dP00])[ke] = getInterpolatedDistributionForVeloBC(q, f_W, f_E, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0P0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloY;
-         (dist.f[d0M0])[ks] = getInterpolatedDistributionForVeloBC(q, f_N, f_S, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0M0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = -vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloY;
-         (dist.f[d0P0])[kn] = getInterpolatedDistributionForVeloBC(q, f_S, f_N, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloZ;
-         (dist.f[d00M])[kb] = getInterpolatedDistributionForVeloBC(q, f_T, f_B, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = -vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloZ;
-         (dist.f[d00P])[kt] = getInterpolatedDistributionForVeloBC(q, f_B, f_T, feq, omega, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dPP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloY;
-         (dist.f[dMM0])[ksw] = getInterpolatedDistributionForVeloBC(q, f_NE, f_SW, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX - VeloY;
-         (dist.f[dPP0])[kne] = getInterpolatedDistributionForVeloBC(q, f_SW, f_NE, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloY;
-         (dist.f[dMP0])[knw] = getInterpolatedDistributionForVeloBC(q, f_SE, f_NW, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloY;
-         (dist.f[dPM0])[kse] = getInterpolatedDistributionForVeloBC(q, f_NW, f_SE, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloZ;
-         (dist.f[dM0M])[kbw] = getInterpolatedDistributionForVeloBC(q, f_TE, f_BW, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-        VeloX = slipLength*vx1;
-        VeloZ = slipLength*vx3;
-        if (x == true) VeloX = c0o1;
-        if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx1 - vx3;
-        feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX - VeloZ;
-         (dist.f[dP0P])[kte] = getInterpolatedDistributionForVeloBC(q, f_BW, f_TE, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloZ;
-         (dist.f[dM0P])[ktw] = getInterpolatedDistributionForVeloBC(q, f_BE, f_TW, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloZ;
-         (dist.f[dP0M])[kbe] = getInterpolatedDistributionForVeloBC(q, f_TW, f_BE, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0PP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY + VeloZ;
-         (dist.f[d0MM])[kbs] = getInterpolatedDistributionForVeloBC(q, f_TN, f_BS, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY - VeloZ;
-         (dist.f[d0PP])[ktn] = getInterpolatedDistributionForVeloBC(q, f_BS, f_TN, feq, omega, velocityBC, c1o54);
-      }
-
-
-      q = (subgridD.q[d0PM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY - VeloZ;
-         (dist.f[d0MP])[kts] = getInterpolatedDistributionForVeloBC(q, f_BN, f_TS, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY + VeloZ;
-         (dist.f[d0PM])[kbn] = getInterpolatedDistributionForVeloBC(q, f_TS, f_BN, feq, omega, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY + VeloZ;
-         (dist.f[dMMM])[kbsw] = getInterpolatedDistributionForVeloBC(q, f_TNE, f_BSW, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY - VeloZ;
-         (dist.f[dPPP])[ktne] = getInterpolatedDistributionForVeloBC(q, f_BSW, f_TNE, feq, omega, velocityBC, c1o216);
-      }
-
-
-      q = (subgridD.q[dPPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY - VeloZ;
-         (dist.f[dMMP])[ktsw] = getInterpolatedDistributionForVeloBC(q, f_BNE, f_TSW, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY + VeloZ;
-         (dist.f[dPPM])[kbne] = getInterpolatedDistributionForVeloBC(q, f_TSW, f_BNE, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY + VeloZ;
-         (dist.f[dMPM])[kbnw] = getInterpolatedDistributionForVeloBC(q, f_TSE, f_BNW, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY - VeloZ;
-         (dist.f[dPMP])[ktse] = getInterpolatedDistributionForVeloBC(q, f_BNW, f_TSE, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY - VeloZ;
-         (dist.f[dMPP])[ktnw] = getInterpolatedDistributionForVeloBC(q, f_BSE, f_TNW, feq, omega, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY + VeloZ;
-         (dist.f[dPMM])[kbse] = getInterpolatedDistributionForVeloBC(q, f_TNW, f_BSE, feq, omega, velocityBC, c1o216);
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-__global__ void BBSlipDeviceComp27(
-    real* distributions, 
-    int* subgridDistanceIndices, 
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   //! The slip boundary condition is executed in the following steps
-   //!
-
-   ////////////////////////////////////////////////////////////////////////////////
-   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
-   //!
-   const unsigned nodeIndex = getNodeIndex();
-
-   if(nodeIndex < numberOfBCnodes)
-   {
-      //////////////////////////////////////////////////////////////////////////
-      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
-      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
-      //!
-      Distributions27 dist = vf::gpu::getDistributionReferences27(distributions, numberOfLBnodes, isEvenTimestep);
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local subgrid distances (q's)
-      //!
-      SubgridDistances27 subgridD;
-      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set neighbor indices (necessary for indirect addressing)
-      //!
-      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
-      unsigned int kzero= indexOfBCnode;
-      unsigned int ke   = indexOfBCnode;
-      unsigned int kw   = neighborX[indexOfBCnode];
-      unsigned int kn   = indexOfBCnode;
-      unsigned int ks   = neighborY[indexOfBCnode];
-      unsigned int kt   = indexOfBCnode;
-      unsigned int kb   = neighborZ[indexOfBCnode];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = indexOfBCnode;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = indexOfBCnode;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = indexOfBCnode;
-      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 = indexOfBCnode;
-      unsigned int kbsw = neighborZ[ksw];
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local distributions
-      //!
-      real f_W    = (dist.f[dP00])[ke   ];
-      real f_E    = (dist.f[dM00])[kw   ];
-      real f_S    = (dist.f[d0P0])[kn   ];
-      real f_N    = (dist.f[d0M0])[ks   ];
-      real f_B    = (dist.f[d00P])[kt   ];
-      real f_T    = (dist.f[d00M])[kb   ];
-      real f_SW   = (dist.f[dPP0])[kne  ];
-      real f_NE   = (dist.f[dMM0])[ksw  ];
-      real f_NW   = (dist.f[dPM0])[kse  ];
-      real f_SE   = (dist.f[dMP0])[knw  ];
-      real f_BW   = (dist.f[dP0P])[kte  ];
-      real f_TE   = (dist.f[dM0M])[kbw  ];
-      real f_TW   = (dist.f[dP0M])[kbe  ];
-      real f_BE   = (dist.f[dM0P])[ktw  ];
-      real f_BS   = (dist.f[d0PP])[ktn  ];
-      real f_TN   = (dist.f[d0MM])[kbs  ];
-      real f_TS   = (dist.f[d0PM])[kbn  ];
-      real f_BN   = (dist.f[d0MP])[kts  ];
-      real f_BSW  = (dist.f[dPPP])[ktne ];
-      real f_BNE  = (dist.f[dMMP])[ktsw ];
-      real f_BNW  = (dist.f[dPMP])[ktse ];
-      real f_BSE  = (dist.f[dMPP])[ktnw ];
-      real f_TSW  = (dist.f[dPPM])[kbne ];
-      real f_TNE  = (dist.f[dMMM])[kbsw ];
-      real f_TNW  = (dist.f[dPMM])[kbse ];
-      real f_TSE  = (dist.f[dMPM])[kbnw ];
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Calculate macroscopic quantities
-      //!
-      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
-
-      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                   (f_E - f_W)) / (c1o1 + drho);
-
-      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                   (f_N - f_S)) / (c1o1 + drho);
-
-      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                   (f_T - f_B)) / (c1o1 + drho);
-
-      // real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - change the pointer to write the results in the correct array
-      //!
-
-      dist = vf::gpu::getDistributionReferences27(distributions, numberOfLBnodes, !isEvenTimestep);
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Multiply the local velocities by the slipLength
-      //!
-      real slipLength = c1o1;
-      real VeloX = slipLength*vx1;
-      real VeloY = slipLength*vx2;
-      real VeloZ = slipLength*vx3;
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Update distributions with subgrid distance (q) between zero and one
-      //!
-      real q, velocityBC;
-
-      bool x = false;
-      bool y = false;
-      bool z = false;
-
-      q = (subgridD.q[dP00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityBC = VeloX;
-         (dist.f[dM00])[kw] = getBounceBackDistributionForVeloBC(f_W, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dM00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityBC = -VeloX;
-         (dist.f[dP00])[ke] = getBounceBackDistributionForVeloBC(f_E, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0P0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityBC = VeloY;
-         (dist.f[d0M0])[ks] = getBounceBackDistributionForVeloBC(f_S, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0M0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityBC = -VeloY;
-         (dist.f[d0P0])[kn] = getBounceBackDistributionForVeloBC(f_N, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityBC = VeloZ;
-         (dist.f[d00M])[kb] = getBounceBackDistributionForVeloBC(f_B, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityBC = -VeloZ;
-         (dist.f[d00P])[kt] = getBounceBackDistributionForVeloBC(f_T, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dPP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityBC = VeloX + VeloY;
-         (dist.f[dMM0])[ksw] = getBounceBackDistributionForVeloBC(f_SW, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityBC = -VeloX - VeloY;
-         (dist.f[dPP0])[kne] = getBounceBackDistributionForVeloBC(f_NE, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityBC = VeloX - VeloY;
-         (dist.f[dMP0])[knw] = getBounceBackDistributionForVeloBC(f_NW, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityBC = -VeloX + VeloY;
-         (dist.f[dPM0])[kse] = getBounceBackDistributionForVeloBC(f_SE, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX + VeloZ;
-         (dist.f[dM0M])[kbw] = getBounceBackDistributionForVeloBC(f_BW, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-        VeloX = slipLength*vx1;
-        VeloZ = slipLength*vx3;
-        if (x == true) VeloX = c0o1;
-        if (z == true) VeloZ = c0o1;
-
-        velocityBC = -VeloX - VeloZ;
-        (dist.f[dP0P])[kte] = getBounceBackDistributionForVeloBC(f_TE, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX - VeloZ;
-         (dist.f[dM0P])[ktw] = getBounceBackDistributionForVeloBC(f_TW, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloX + VeloZ;
-         (dist.f[dP0M])[kbe] = getBounceBackDistributionForVeloBC(f_BE, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0PP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloY + VeloZ;
-         (dist.f[d0MM])[kbs] = getBounceBackDistributionForVeloBC(f_BS, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloY - VeloZ;
-         (dist.f[d0PP])[ktn] = getBounceBackDistributionForVeloBC(f_TN, velocityBC, c1o54);
-      }
-
-
-      q = (subgridD.q[d0PM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloY - VeloZ;
-         (dist.f[d0MP])[kts] = getBounceBackDistributionForVeloBC(f_TS, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloY + VeloZ;
-         (dist.f[d0PM])[kbn] = getBounceBackDistributionForVeloBC(f_BN, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX + VeloY + VeloZ;
-         (dist.f[dMMM])[kbsw] = getBounceBackDistributionForVeloBC(f_TNE, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloX - VeloY - VeloZ;
-         (dist.f[dPPP])[ktne] = getBounceBackDistributionForVeloBC(f_TNE, velocityBC, c1o216);
-      }
-
-
-      q = (subgridD.q[dPPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX + VeloY - VeloZ;
-         (dist.f[dMMP])[ktsw] = getBounceBackDistributionForVeloBC(f_TSW, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloX - VeloY + VeloZ;
-         (dist.f[dPPM])[kbne] = getBounceBackDistributionForVeloBC(f_BNE, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX - VeloY + VeloZ;
-         (dist.f[dMPM])[kbnw] = getBounceBackDistributionForVeloBC(f_BNW, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloX + VeloY - VeloZ;
-         (dist.f[dPMP])[ktse] = getBounceBackDistributionForVeloBC(f_TSE, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = VeloX - VeloY - VeloZ;
-         (dist.f[dMPP])[ktnw] = getBounceBackDistributionForVeloBC(f_TNW, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityBC = -VeloX + VeloY + VeloZ;
-         (dist.f[dPMM])[kbse] = getBounceBackDistributionForVeloBC(f_BSE, velocityBC, c1o216);
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipDeviceComp27TurbViscosity(
-    real* distributions, 
-    int* subgridDistanceIndices, 
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    real omega, 
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    real* turbViscosity,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   //! The slip boundary condition is executed in the following steps
-   //!
-
-   ////////////////////////////////////////////////////////////////////////////////
-   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
-   //!
-   const unsigned nodeIndex = getNodeIndex();
-
-   if(nodeIndex < numberOfBCnodes)
-   {
-      //////////////////////////////////////////////////////////////////////////
-      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
-      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
-      //!
-      Distributions27 dist;
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local subgrid distances (q's)
-      //!
-      SubgridDistances27 subgridD;
-      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set neighbor indices (necessary for indirect addressing)
-      //!
-      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
-      unsigned int kzero= indexOfBCnode;
-      unsigned int ke   = indexOfBCnode;
-      unsigned int kw   = neighborX[indexOfBCnode];
-      unsigned int kn   = indexOfBCnode;
-      unsigned int ks   = neighborY[indexOfBCnode];
-      unsigned int kt   = indexOfBCnode;
-      unsigned int kb   = neighborZ[indexOfBCnode];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = indexOfBCnode;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = indexOfBCnode;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = indexOfBCnode;
-      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 = indexOfBCnode;
-      unsigned int kbsw = neighborZ[ksw];
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local distributions
-      //!
-      real f_W    = (dist.f[dP00])[ke   ];
-      real f_E    = (dist.f[dM00])[kw   ];
-      real f_S    = (dist.f[d0P0])[kn   ];
-      real f_N    = (dist.f[d0M0])[ks   ];
-      real f_B    = (dist.f[d00P])[kt   ];
-      real f_T    = (dist.f[d00M])[kb   ];
-      real f_SW   = (dist.f[dPP0])[kne  ];
-      real f_NE   = (dist.f[dMM0])[ksw  ];
-      real f_NW   = (dist.f[dPM0])[kse  ];
-      real f_SE   = (dist.f[dMP0])[knw  ];
-      real f_BW   = (dist.f[dP0P])[kte  ];
-      real f_TE   = (dist.f[dM0M])[kbw  ];
-      real f_TW   = (dist.f[dP0M])[kbe  ];
-      real f_BE   = (dist.f[dM0P])[ktw  ];
-      real f_BS   = (dist.f[d0PP])[ktn  ];
-      real f_TN   = (dist.f[d0MM])[kbs  ];
-      real f_TS   = (dist.f[d0PM])[kbn  ];
-      real f_BN   = (dist.f[d0MP])[kts  ];
-      real f_BSW  = (dist.f[dPPP])[ktne ];
-      real f_BNE  = (dist.f[dMMP])[ktsw ];
-      real f_BNW  = (dist.f[dPMP])[ktse ];
-      real f_BSE  = (dist.f[dMPP])[ktnw ];
-      real f_TSW  = (dist.f[dPPM])[kbne ];
-      real f_TNE  = (dist.f[dMMM])[kbsw ];
-      real f_TNW  = (dist.f[dPMM])[kbse ];
-      real f_TSE  = (dist.f[dMPM])[kbnw ];
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Calculate macroscopic quantities
-      //!
-      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
-
-      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                   (f_E - f_W)) / (c1o1 + drho);
-
-      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                   (f_N - f_S)) / (c1o1 + drho);
-
-      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                   (f_T - f_B)) / (c1o1 + drho);
-
-      real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - change the pointer to write the results in the correct array
-      //!
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - compute local relaxation rate
-      //!
-      real om_turb = omega / (c1o1 + c3o1* omega* max(c0o1, turbViscosity[indexOfBCnode]) );
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Multiply the local velocities by the slipLength
-      //!
-      real slipLength = c1o1;
-      real VeloX = slipLength*vx1;
-      real VeloY = slipLength*vx2;
-      real VeloZ = slipLength*vx3;
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Update distributions with subgrid distance (q) between zero and one
-      //!
-      real feq, q, velocityLB, velocityBC;
-
-      bool x = false;
-      bool y = false;
-      bool z = false;
-
-      q = (subgridD.q[dP00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloX;
-         (dist.f[dM00])[kw] = getInterpolatedDistributionForVeloBC(q, f_E, f_W, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dM00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = -vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloX;
-         (dist.f[dP00])[ke] = getInterpolatedDistributionForVeloBC(q, f_W, f_E, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0P0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloY;
-         (dist.f[d0M0])[ks] = getInterpolatedDistributionForVeloBC(q, f_N, f_S, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0M0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = -vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloY;
-         (dist.f[d0P0])[kn] = getInterpolatedDistributionForVeloBC(q, f_S, f_N, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloZ;
-         (dist.f[d00M])[kb] = getInterpolatedDistributionForVeloBC(q, f_T, f_B, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = -vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloZ;
-         (dist.f[d00P])[kt] = getInterpolatedDistributionForVeloBC(q, f_B, f_T, feq, om_turb, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dPP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloY;
-         (dist.f[dMM0])[ksw] = getInterpolatedDistributionForVeloBC(q, f_NE, f_SW, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX - VeloY;
-         (dist.f[dPP0])[kne] = getInterpolatedDistributionForVeloBC(q, f_SW, f_NE, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloY;
-         (dist.f[dMP0])[knw] = getInterpolatedDistributionForVeloBC(q, f_SE, f_NW, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloY;
-         (dist.f[dPM0])[kse] = getInterpolatedDistributionForVeloBC(q, f_NW, f_SE, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloZ;
-         (dist.f[dM0M])[kbw] = getInterpolatedDistributionForVeloBC(q, f_TE, f_BW, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-        VeloX = slipLength*vx1;
-        VeloZ = slipLength*vx3;
-        if (x == true) VeloX = c0o1;
-        if (z == true) VeloZ = c0o1;
-
-        velocityLB = -vx1 - vx3;
-        feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-        velocityBC = -VeloX - VeloZ;
-        (dist.f[dP0P])[kte] = getInterpolatedDistributionForVeloBC(q, f_BW, f_TE, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloZ;
-         (dist.f[dM0P])[ktw] = getInterpolatedDistributionForVeloBC(q, f_BE, f_TW, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloZ;
-         (dist.f[dP0M])[kbe] = getInterpolatedDistributionForVeloBC(q, f_TW, f_BE, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0PP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY + VeloZ;
-         (dist.f[d0MM])[kbs] = getInterpolatedDistributionForVeloBC(q, f_TN, f_BS, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY - VeloZ;
-         (dist.f[d0PP])[ktn] = getInterpolatedDistributionForVeloBC(q, f_BS, f_TN, feq, om_turb, velocityBC, c1o54);
-      }
-
-
-      q = (subgridD.q[d0PM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY - VeloZ;
-         (dist.f[d0MP])[kts] = getInterpolatedDistributionForVeloBC(q, f_BN, f_TS, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY + VeloZ;
-         (dist.f[d0PM])[kbn] = getInterpolatedDistributionForVeloBC(q, f_TS, f_BN, feq, om_turb, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY + VeloZ;
-         (dist.f[dMMM])[kbsw] = getInterpolatedDistributionForVeloBC(q, f_TNE, f_BSW, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY - VeloZ;
-         (dist.f[dPPP])[ktne] = getInterpolatedDistributionForVeloBC(q, f_BSW, f_TNE, feq, om_turb, velocityBC, c1o216);
-      }
-
-
-      q = (subgridD.q[dPPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY - VeloZ;
-         (dist.f[dMMP])[ktsw] = getInterpolatedDistributionForVeloBC(q, f_BNE, f_TSW, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY + VeloZ;
-         (dist.f[dPPM])[kbne] = getInterpolatedDistributionForVeloBC(q, f_TSW, f_BNE, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY + VeloZ;
-         (dist.f[dMPM])[kbnw] = getInterpolatedDistributionForVeloBC(q, f_TSE, f_BNW, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY - VeloZ;
-         (dist.f[dPMP])[ktse] = getInterpolatedDistributionForVeloBC(q, f_BNW, f_TSE, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY - VeloZ;
-         (dist.f[dMPP])[ktnw] = getInterpolatedDistributionForVeloBC(q, f_BSE, f_TNW, feq, om_turb, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY + VeloZ;
-         (dist.f[dPMM])[kbse] = getInterpolatedDistributionForVeloBC(q, f_TNW, f_BSE, feq, om_turb, velocityBC, c1o216);
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipPressureDeviceComp27TurbViscosity(
-    real* distributions, 
-    int* subgridDistanceIndices, 
-    real* subgridDistances,
-    unsigned int numberOfBCnodes,
-    real omega, 
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    real* turbViscosity,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   //! The slip boundary condition is executed in the following steps
-   //!
-   ////////////////////////////////////////////////////////////////////////////////
-   //! - Get node index coordinates from threadIdx, blockIdx, blockDim and gridDim.
-   //!
-   const unsigned nodeIndex = getNodeIndex();
-
-   if(nodeIndex < numberOfBCnodes)
-   {
-      //////////////////////////////////////////////////////////////////////////
-      //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref
-      //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a>
-      //!
-      Distributions27 dist;
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, isEvenTimestep);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local subgrid distances (q's)
-      //!
-      SubgridDistances27 subgridD;
-      getPointersToSubgridDistances(subgridD, subgridDistances, numberOfBCnodes);
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set neighbor indices (necessary for indirect addressing)
-      //!
-      unsigned int indexOfBCnode  = subgridDistanceIndices[nodeIndex];
-      unsigned int kzero= indexOfBCnode;
-      unsigned int ke   = indexOfBCnode;
-      unsigned int kw   = neighborX[indexOfBCnode];
-      unsigned int kn   = indexOfBCnode;
-      unsigned int ks   = neighborY[indexOfBCnode];
-      unsigned int kt   = indexOfBCnode;
-      unsigned int kb   = neighborZ[indexOfBCnode];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = indexOfBCnode;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = indexOfBCnode;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = indexOfBCnode;
-      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 = indexOfBCnode;
-      unsigned int kbsw = neighborZ[ksw];
-      
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Set local distributions
-      //!
-      real f_W    = (dist.f[dP00])[ke   ];
-      real f_E    = (dist.f[dM00])[kw   ];
-      real f_S    = (dist.f[d0P0])[kn   ];
-      real f_N    = (dist.f[d0M0])[ks   ];
-      real f_B    = (dist.f[d00P])[kt   ];
-      real f_T    = (dist.f[d00M])[kb   ];
-      real f_SW   = (dist.f[dPP0])[kne  ];
-      real f_NE   = (dist.f[dMM0])[ksw  ];
-      real f_NW   = (dist.f[dPM0])[kse  ];
-      real f_SE   = (dist.f[dMP0])[knw  ];
-      real f_BW   = (dist.f[dP0P])[kte  ];
-      real f_TE   = (dist.f[dM0M])[kbw  ];
-      real f_TW   = (dist.f[dP0M])[kbe  ];
-      real f_BE   = (dist.f[dM0P])[ktw  ];
-      real f_BS   = (dist.f[d0PP])[ktn  ];
-      real f_TN   = (dist.f[d0MM])[kbs  ];
-      real f_TS   = (dist.f[d0PM])[kbn  ];
-      real f_BN   = (dist.f[d0MP])[kts  ];
-      real f_BSW  = (dist.f[dPPP])[ktne ];
-      real f_BNE  = (dist.f[dMMP])[ktsw ];
-      real f_BNW  = (dist.f[dPMP])[ktse ];
-      real f_BSE  = (dist.f[dMPP])[ktnw ];
-      real f_TSW  = (dist.f[dPPM])[kbne ];
-      real f_TNE  = (dist.f[dMMM])[kbsw ];
-      real f_TNW  = (dist.f[dPMM])[kbse ];
-      real f_TSE  = (dist.f[dMPM])[kbnw ];
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Calculate macroscopic quantities
-      //!
-      real drho = f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                  f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                  f_T + f_B + f_N + f_S + f_E + f_W + ((dist.f[d000])[kzero]); 
-
-      real vx1  = (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                   (f_E - f_W)) / (c1o1 + drho);
-
-      real vx2  = ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                   ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                   (f_N - f_S)) / (c1o1 + drho);
-
-      real vx3  = (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                   (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                   (f_T - f_B)) / (c1o1 + drho);
-
-      real cu_sq = c3o2 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3) * (c1o1 + drho);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - change the pointer to write the results in the correct array
-      //!
-      getPointersToDistributions(dist, distributions, numberOfLBnodes, !isEvenTimestep);
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - compute local relaxation rate
-      //!
-      real om_turb = omega / (c1o1 + c3o1* omega* max(c0o1, turbViscosity[indexOfBCnode]) );
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Multiply the local velocities by the slipLength
-      //!
-      real slipLength = c1o1;
-      real VeloX = slipLength*vx1;
-      real VeloY = slipLength*vx2;
-      real VeloZ = slipLength*vx3;
-
-      ////////////////////////////////////////////////////////////////////////////////
-      //! - Update distributions with subgrid distance (q) between zero and one
-      //!
-      real feq, q, velocityLB, velocityBC;
-
-      bool x = false;
-      bool y = false;
-      bool z = false;
-
-      q = (subgridD.q[dP00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)  // only update distribution for q between zero and one
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloX;
-         (dist.f[dM00])[kw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_E, f_W, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dM00])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = c0o1;
-         x = true;
-
-         velocityLB = -vx1;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloX;
-         (dist.f[dP00])[ke] = getInterpolatedDistributionForVeloWithPressureBC(q, f_W, f_E, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0P0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloY;
-         (dist.f[d0M0])[ks] = getInterpolatedDistributionForVeloWithPressureBC(q, f_N, f_S, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d0M0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = c0o1;
-         y = true;
-
-         velocityLB = -vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloY;
-         (dist.f[d0P0])[kn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_S, f_N, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = VeloZ;
-         (dist.f[d00M])[kb] = getInterpolatedDistributionForVeloWithPressureBC(q, f_T, f_B, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[d00M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = c0o1;
-         z = true;
-
-         velocityLB = -vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c2o27);
-         velocityBC = -VeloZ;
-         (dist.f[d00P])[kt] = getInterpolatedDistributionForVeloWithPressureBC(q, f_B, f_T, feq, om_turb, drho, velocityBC, c2o27);
-      }
-
-      q = (subgridD.q[dPP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloY;
-         (dist.f[dMM0])[ksw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_NE, f_SW, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX - VeloY;
-         (dist.f[dPP0])[kne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_SW, f_NE, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPM0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = vx1 - vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloY;
-         (dist.f[dMP0])[knw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_SE, f_NW, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dMP0])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-
-         velocityLB = -vx1 + vx2;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloY;
-         (dist.f[dPM0])[kse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_NW, f_SE, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX + VeloZ;
-         (dist.f[dM0M])[kbw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TE, f_BW, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-        VeloX = slipLength*vx1;
-        VeloZ = slipLength*vx3;
-        if (x == true) VeloX = c0o1;
-        if (z == true) VeloZ = c0o1;
-
-        velocityLB = -vx1 - vx3;
-        feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-        velocityBC = -VeloX - VeloZ;
-        (dist.f[dP0P])[kte] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BW, f_TE, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dP0M])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx1 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloX - VeloZ;
-         (dist.f[dM0P])[ktw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BE, f_TW, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dM0P])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx1 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloX + VeloZ;
-         (dist.f[dP0M])[kbe] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TW, f_BE, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0PP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY + VeloZ;
-         (dist.f[d0MM])[kbs] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TN, f_BS, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY - VeloZ;
-         (dist.f[d0PP])[ktn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BS, f_TN, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-
-      q = (subgridD.q[d0PM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = VeloY - VeloZ;
-         (dist.f[d0MP])[kts] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BN, f_TS, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[d0MP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-
-         velocityLB = -vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o54);
-         velocityBC = -VeloY + VeloZ;
-         (dist.f[d0PM])[kbn] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TS, f_BN, feq, om_turb, drho, velocityBC, c1o54);
-      }
-
-      q = (subgridD.q[dPPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY + VeloZ;
-         (dist.f[dMMM])[kbsw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TNE, f_BSW, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY - VeloZ;
-         (dist.f[dPPP])[ktne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BSW, f_TNE, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-
-      q = (subgridD.q[dPPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX + VeloY - VeloZ;
-         (dist.f[dMMP])[ktsw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BNE, f_TSW, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX - VeloY + VeloZ;
-         (dist.f[dPPM])[kbne] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TSW, f_BNE, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY + VeloZ;
-         (dist.f[dMPM])[kbnw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TSE, f_BNW, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY - VeloZ;
-         (dist.f[dPMP])[ktse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BNW, f_TSE, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dPMM])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = vx1 - vx2 - vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = VeloX - VeloY - VeloZ;
-         (dist.f[dMPP])[ktnw] = getInterpolatedDistributionForVeloWithPressureBC(q, f_BSE, f_TNW, feq, om_turb, drho, velocityBC, c1o216);
-      }
-
-      q = (subgridD.q[dMPP])[nodeIndex];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = slipLength*vx1;
-         VeloY = slipLength*vx2;
-         VeloZ = slipLength*vx3;
-         if (x == true) VeloX = c0o1;
-         if (y == true) VeloY = c0o1;
-         if (z == true) VeloZ = c0o1;
-         velocityLB = -vx1 + vx2 + vx3;
-         feq = getEquilibriumForBC(drho, velocityLB, cu_sq, c1o216);
-         velocityBC = -VeloX + VeloY + VeloZ;
-         (dist.f[dPMM])[kbse] = getInterpolatedDistributionForVeloWithPressureBC(q, f_TNW, f_BSE, feq, om_turb, drho, velocityBC, c1o216);
-      }
-   }
-}
-
-// __global__ void QSlipDeviceComp27TurbViscosity(real* DD, 
-//                                              int* k_Q, 
-//                                              real* QQ,
-//                                              unsigned int numberOfBCnodes,
-//                                              real om1, 
-//                                              unsigned int* neighborX,
-//                                              unsigned int* neighborY,
-//                                              unsigned int* neighborZ,
-//                                   real* turbViscosity,
-//                                              unsigned int size_Mat, 
-//                                              bool isEvenTimestep)
-// {
-//    Distributions27 D;
-//    if (isEvenTimestep==true)
-//    {
-//       D.f[dP00] = &DD[dP00 * size_Mat];
-//       D.f[dM00] = &DD[dM00 * size_Mat];
-//       D.f[d0P0] = &DD[d0P0 * size_Mat];
-//       D.f[d0M0] = &DD[d0M0 * size_Mat];
-//       D.f[d00P] = &DD[d00P * size_Mat];
-//       D.f[d00M] = &DD[d00M * size_Mat];
-//       D.f[dPP0] = &DD[dPP0 * size_Mat];
-//       D.f[dMM0] = &DD[dMM0 * size_Mat];
-//       D.f[dPM0] = &DD[dPM0 * size_Mat];
-//       D.f[dMP0] = &DD[dMP0 * size_Mat];
-//       D.f[dP0P] = &DD[dP0P * size_Mat];
-//       D.f[dM0M] = &DD[dM0M * size_Mat];
-//       D.f[dP0M] = &DD[dP0M * size_Mat];
-//       D.f[dM0P] = &DD[dM0P * size_Mat];
-//       D.f[d0PP] = &DD[d0PP * size_Mat];
-//       D.f[d0MM] = &DD[d0MM * size_Mat];
-//       D.f[d0PM] = &DD[d0PM * size_Mat];
-//       D.f[d0MP] = &DD[d0MP * size_Mat];
-//       D.f[d000] = &DD[d000 * size_Mat];
-//       D.f[dPPP] = &DD[dPPP * size_Mat];
-//       D.f[dMMP] = &DD[dMMP * size_Mat];
-//       D.f[dPMP] = &DD[dPMP * size_Mat];
-//       D.f[dMPP] = &DD[dMPP * size_Mat];
-//       D.f[dPPM] = &DD[dPPM * size_Mat];
-//       D.f[dMMM] = &DD[dMMM * size_Mat];
-//       D.f[dPMM] = &DD[dPMM * size_Mat];
-//       D.f[dMPM] = &DD[dMPM * size_Mat];
-//    } 
-//    else
-//    {
-//       D.f[dM00] = &DD[dP00 * size_Mat];
-//       D.f[dP00] = &DD[dM00 * size_Mat];
-//       D.f[d0M0] = &DD[d0P0 * size_Mat];
-//       D.f[d0P0] = &DD[d0M0 * size_Mat];
-//       D.f[d00M] = &DD[d00P * size_Mat];
-//       D.f[d00P] = &DD[d00M * size_Mat];
-//       D.f[dMM0] = &DD[dPP0 * size_Mat];
-//       D.f[dPP0] = &DD[dMM0 * size_Mat];
-//       D.f[dMP0] = &DD[dPM0 * size_Mat];
-//       D.f[dPM0] = &DD[dMP0 * size_Mat];
-//       D.f[dM0M] = &DD[dP0P * size_Mat];
-//       D.f[dP0P] = &DD[dM0M * size_Mat];
-//       D.f[dM0P] = &DD[dP0M * size_Mat];
-//       D.f[dP0M] = &DD[dM0P * size_Mat];
-//       D.f[d0MM] = &DD[d0PP * size_Mat];
-//       D.f[d0PP] = &DD[d0MM * size_Mat];
-//       D.f[d0MP] = &DD[d0PM * size_Mat];
-//       D.f[d0PM] = &DD[d0MP * size_Mat];
-//       D.f[d000] = &DD[d000 * size_Mat];
-//       D.f[dPPP] = &DD[dMMM * size_Mat];
-//       D.f[dMMP] = &DD[dPPM * size_Mat];
-//       D.f[dPMP] = &DD[dMPM * size_Mat];
-//       D.f[dMPP] = &DD[dPMM * size_Mat];
-//       D.f[dPPM] = &DD[dMMP * size_Mat];
-//       D.f[dMMM] = &DD[dPPP * size_Mat];
-//       D.f[dPMM] = &DD[dMPP * size_Mat];
-//       D.f[dMPM] = &DD[dPMP * size_Mat];
-//    }
-//    ////////////////////////////////////////////////////////////////////////////////
-//    const unsigned  x = threadIdx.x;  // Globaler x-Index 
-//    const unsigned  y = blockIdx.x;   // Globaler y-Index 
-//    const unsigned  z = blockIdx.y;   // Globaler z-Index 
-
-//    const unsigned nx = blockDim.x;
-//    const unsigned ny = gridDim.x;
-
-//    const unsigned k = nx*(ny*z + y) + x;
-//    //////////////////////////////////////////////////////////////////////////
-
-//    if(k<numberOfBCnodes)
-//    {
-//       ////////////////////////////////////////////////////////////////////////////////
-//       real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
-//             *q_dirNE,  *q_dirSW,  *q_dirSE,  *q_dirNW,  *q_dirTE,  *q_dirBW,
-//             *q_dirBE,  *q_dirTW,  *q_dirTN,  *q_dirBS,  *q_dirBN,  *q_dirTS,
-//             *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
-//             *q_dirBSE, *q_dirBNW; 
-//       q_dirE   = &QQ[dP00 * numberOfBCnodes];
-//       q_dirW   = &QQ[dM00 * numberOfBCnodes];
-//       q_dirN   = &QQ[d0P0 * numberOfBCnodes];
-//       q_dirS   = &QQ[d0M0 * numberOfBCnodes];
-//       q_dirT   = &QQ[d00P * numberOfBCnodes];
-//       q_dirB   = &QQ[d00M * numberOfBCnodes];
-//       q_dirNE  = &QQ[dPP0 * numberOfBCnodes];
-//       q_dirSW  = &QQ[dMM0 * numberOfBCnodes];
-//       q_dirSE  = &QQ[dPM0 * numberOfBCnodes];
-//       q_dirNW  = &QQ[dMP0 * numberOfBCnodes];
-//       q_dirTE  = &QQ[dP0P * numberOfBCnodes];
-//       q_dirBW  = &QQ[dM0M * numberOfBCnodes];
-//       q_dirBE  = &QQ[dP0M * numberOfBCnodes];
-//       q_dirTW  = &QQ[dM0P * numberOfBCnodes];
-//       q_dirTN  = &QQ[d0PP * numberOfBCnodes];
-//       q_dirBS  = &QQ[d0MM * numberOfBCnodes];
-//       q_dirBN  = &QQ[d0PM * numberOfBCnodes];
-//       q_dirTS  = &QQ[d0MP * numberOfBCnodes];
-//       q_dirTNE = &QQ[dPPP * numberOfBCnodes];
-//       q_dirTSW = &QQ[dMMP * numberOfBCnodes];
-//       q_dirTSE = &QQ[dPMP * numberOfBCnodes];
-//       q_dirTNW = &QQ[dMPP * numberOfBCnodes];
-//       q_dirBNE = &QQ[dPPM * numberOfBCnodes];
-//       q_dirBSW = &QQ[dMMM * numberOfBCnodes];
-//       q_dirBSE = &QQ[dPMM * numberOfBCnodes];
-//       q_dirBNW = &QQ[dMPM * numberOfBCnodes];
-//       ////////////////////////////////////////////////////////////////////////////////
-//       //index
-//       unsigned int KQK  = k_Q[k];
-//       unsigned int kzero= KQK;
-//       unsigned int ke   = KQK;
-//       unsigned int kw   = neighborX[KQK];
-//       unsigned int kn   = KQK;
-//       unsigned int ks   = neighborY[KQK];
-//       unsigned int kt   = KQK;
-//       unsigned int kb   = neighborZ[KQK];
-//       unsigned int ksw  = neighborY[kw];
-//       unsigned int kne  = KQK;
-//       unsigned int kse  = ks;
-//       unsigned int knw  = kw;
-//       unsigned int kbw  = neighborZ[kw];
-//       unsigned int kte  = KQK;
-//       unsigned int kbe  = kb;
-//       unsigned int ktw  = kw;
-//       unsigned int kbs  = neighborZ[ks];
-//       unsigned int ktn  = KQK;
-//       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 = KQK;
-//       unsigned int kbsw = neighborZ[ksw];
-      
-//       ////////////////////////////////////////////////////////////////////////////////
-//       real f_W    = (D.f[dP00])[ke   ];
-//       real f_E    = (D.f[dM00])[kw   ];
-//       real f_S    = (D.f[d0P0])[kn   ];
-//       real f_N    = (D.f[d0M0])[ks   ];
-//       real f_B    = (D.f[d00P])[kt   ];
-//       real f_T    = (D.f[d00M])[kb   ];
-//       real f_SW   = (D.f[dPP0])[kne  ];
-//       real f_NE   = (D.f[dMM0])[ksw  ];
-//       real f_NW   = (D.f[dPM0])[kse  ];
-//       real f_SE   = (D.f[dMP0])[knw  ];
-//       real f_BW   = (D.f[dP0P])[kte  ];
-//       real f_TE   = (D.f[dM0M])[kbw  ];
-//       real f_TW   = (D.f[dP0M])[kbe  ];
-//       real f_BE   = (D.f[dM0P])[ktw  ];
-//       real f_BS   = (D.f[d0PP])[ktn  ];
-//       real f_TN   = (D.f[d0MM])[kbs  ];
-//       real f_TS   = (D.f[d0PM])[kbn  ];
-//       real f_BN   = (D.f[d0MP])[kts  ];
-//       real f_BSW  = (D.f[dPPP])[ktne ];
-//       real f_BNE  = (D.f[dMMP])[ktsw ];
-//       real f_BNW  = (D.f[dPMP])[ktse ];
-//       real f_BSE  = (D.f[dMPP])[ktnw ];
-//       real f_TSW  = (D.f[dPPM])[kbne ];
-//       real f_TNE  = (D.f[dMMM])[kbsw ];
-//       real f_TNW  = (D.f[dPMM])[kbse ];
-//       real f_TSE  = (D.f[dMPM])[kbnw ];
-//       ////////////////////////////////////////////////////////////////////////////////
-//       real vx1, vx2, vx3, drho, feq, q;
-//       drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-//                 f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-//                 f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[d000])[kzero]); 
-
-//       vx1    =  (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-//                 ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-//                 (f_E - f_W)) / (c1o1 + drho); 
-         
-
-//       vx2    =   ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-//                  ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-//                  (f_N - f_S)) / (c1o1 + drho); 
-
-//       vx3    =   (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-//                  (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-//                  (f_T - f_B)) / (c1o1 + drho); 
-
-//       real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3) * (c1o1 + drho);
-
-//       //////////////////////////////////////////////////////////////////////////
-//       if (isEvenTimestep==false)
-//       {
-//          D.f[dP00] = &DD[dP00 * size_Mat];
-//          D.f[dM00] = &DD[dM00 * size_Mat];
-//          D.f[d0P0] = &DD[d0P0 * size_Mat];
-//          D.f[d0M0] = &DD[d0M0 * size_Mat];
-//          D.f[d00P] = &DD[d00P * size_Mat];
-//          D.f[d00M] = &DD[d00M * size_Mat];
-//          D.f[dPP0] = &DD[dPP0 * size_Mat];
-//          D.f[dMM0] = &DD[dMM0 * size_Mat];
-//          D.f[dPM0] = &DD[dPM0 * size_Mat];
-//          D.f[dMP0] = &DD[dMP0 * size_Mat];
-//          D.f[dP0P] = &DD[dP0P * size_Mat];
-//          D.f[dM0M] = &DD[dM0M * size_Mat];
-//          D.f[dP0M] = &DD[dP0M * size_Mat];
-//          D.f[dM0P] = &DD[dM0P * size_Mat];
-//          D.f[d0PP] = &DD[d0PP * size_Mat];
-//          D.f[d0MM] = &DD[d0MM * size_Mat];
-//          D.f[d0PM] = &DD[d0PM * size_Mat];
-//          D.f[d0MP] = &DD[d0MP * size_Mat];
-//          D.f[d000] = &DD[d000 * size_Mat];
-//          D.f[dPPP] = &DD[dPPP * size_Mat];
-//          D.f[dMMP] = &DD[dMMP * size_Mat];
-//          D.f[dPMP] = &DD[dPMP * size_Mat];
-//          D.f[dMPP] = &DD[dMPP * size_Mat];
-//          D.f[dPPM] = &DD[dPPM * size_Mat];
-//          D.f[dMMM] = &DD[dMMM * size_Mat];
-//          D.f[dPMM] = &DD[dPMM * size_Mat];
-//          D.f[dMPM] = &DD[dMPM * size_Mat];
-//       } 
-//       else
-//       {
-//          D.f[dM00] = &DD[dP00 * size_Mat];
-//          D.f[dP00] = &DD[dM00 * size_Mat];
-//          D.f[d0M0] = &DD[d0P0 * size_Mat];
-//          D.f[d0P0] = &DD[d0M0 * size_Mat];
-//          D.f[d00M] = &DD[d00P * size_Mat];
-//          D.f[d00P] = &DD[d00M * size_Mat];
-//          D.f[dMM0] = &DD[dPP0 * size_Mat];
-//          D.f[dPP0] = &DD[dMM0 * size_Mat];
-//          D.f[dMP0] = &DD[dPM0 * size_Mat];
-//          D.f[dPM0] = &DD[dMP0 * size_Mat];
-//          D.f[dM0M] = &DD[dP0P * size_Mat];
-//          D.f[dP0P] = &DD[dM0M * size_Mat];
-//          D.f[dM0P] = &DD[dP0M * size_Mat];
-//          D.f[dP0M] = &DD[dM0P * size_Mat];
-//          D.f[d0MM] = &DD[d0PP * size_Mat];
-//          D.f[d0PP] = &DD[d0MM * size_Mat];
-//          D.f[d0MP] = &DD[d0PM * size_Mat];
-//          D.f[d0PM] = &DD[d0MP * size_Mat];
-//          D.f[d000] = &DD[d000 * size_Mat];
-//          D.f[dPPP] = &DD[dMMM * size_Mat];
-//          D.f[dMMP] = &DD[dPPM * size_Mat];
-//          D.f[dPMP] = &DD[dMPM * size_Mat];
-//          D.f[dMPP] = &DD[dPMM * size_Mat];
-//          D.f[dPPM] = &DD[dMMP * size_Mat];
-//          D.f[dMMM] = &DD[dPPP * size_Mat];
-//          D.f[dPMM] = &DD[dMPP * size_Mat];
-//          D.f[dMPM] = &DD[dPMP * size_Mat];
-//       }
-//       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//       //Test
-//       //(D.f[d000])[k]=c1o10;
-//       ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//       real om_turb = om1 / (c1o1 + c3o1*om1*max(c0o1, turbViscosity[k_Q[k]]));
-     
-//      real fac = c1o1;//c99o100;
-//       real VeloX = fac*vx1;
-//       real VeloY = fac*vx2;
-//       real VeloZ = fac*vx3;
-//       bool x = false;
-//       bool y = false;
-//       bool z = false;
-
-//       q = q_dirE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = c0o1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          x = true;
-//          feq=c2o27* (drho/*+three*( vx1        )*/+c9o2*( vx1        )*( vx1        ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dM00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_E+f_W)-c6o1*c2o27*( VeloX     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*( vx1        )+c9over2*( vx1        )*( vx1        )-cu_sq); 
-//          //(D.f[dM00])[kw]=(one-q)/(one+q)*(f_E-feq*om1)/(one-om1)+(q*(f_E+f_W)-six*c2over27*( VeloX     ))/(one+q);
-//          //(D.f[dM00])[kw]=zero;
-//       }
-
-//       q = q_dirW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = c0o1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          x = true;
-//          feq=c2o27* (drho/*+three*(-vx1        )*/+c9o2*(-vx1        )*(-vx1        ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dP00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_W+f_E)-c6o1*c2o27*(-VeloX     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*(-vx1        )+c9over2*(-vx1        )*(-vx1        )-cu_sq); 
-//          //(D.f[dP00])[ke]=(one-q)/(one+q)*(f_W-feq*om_turb)/(one-om_turb)+(q*(f_W+f_E)-six*c2over27*(-VeloX     ))/(one+q);
-//          //(D.f[dP00])[ke]=zero;
-//       }
-
-//       q = q_dirN[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = c0o1;
-//          VeloZ = fac*vx3;
-//          y = true;
-//          feq=c2o27* (drho/*+three*(    vx2     )*/+c9o2*(     vx2    )*(     vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_N+f_S)-c6o1*c2o27*( VeloY     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*(    vx2     )+c9over2*(     vx2    )*(     vx2    )-cu_sq); 
-//          //(D.f[d0M0])[ks]=(one-q)/(one+q)*(f_N-feq*om_turb)/(one-om_turb)+(q*(f_N+f_S)-six*c2over27*( VeloY     ))/(one+q);
-//          //(D.f[d0M0])[ks]=zero;
-//       }
-
-//       q = q_dirS[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = c0o1;
-//          VeloZ = fac*vx3;
-//          y = true;
-//          feq=c2o27* (drho/*+three*(   -vx2     )*/+c9o2*(    -vx2    )*(    -vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_S+f_N)-c6o1*c2o27*(-VeloY     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*(   -vx2     )+c9over2*(    -vx2    )*(    -vx2    )-cu_sq); 
-//          //(D.f[d0P0])[kn]=(one-q)/(one+q)*(f_S-feq*om_turb)/(one-om_turb)+(q*(f_S+f_N)-six*c2over27*(-VeloY     ))/(one+q);
-//          //(D.f[d0P0])[kn]=zero;
-//       }
-
-//       q = q_dirT[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = c0o1;
-//          z = true;
-//          feq=c2o27* (drho/*+three*(         vx3)*/+c9o2*(         vx3)*(         vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_T+f_B)-c6o1*c2o27*( VeloZ     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*(         vx3)+c9over2*(         vx3)*(         vx3)-cu_sq); 
-//          //(D.f[d00M])[kb]=(one-q)/(one+q)*(f_T-feq*om_turb)/(one-om_turb)+(q*(f_T+f_B)-six*c2over27*( VeloZ     ))/(one+q);
-//          //(D.f[d00M])[kb]=one;
-//       }
-
-//       q = q_dirB[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = c0o1;
-//          z = true;
-//          feq=c2o27* (drho/*+three*(        -vx3)*/+c9o2*(        -vx3)*(        -vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_B+f_T)-c6o1*c2o27*(-VeloZ     ))/(c1o1+q) - c2o27 * drho;
-//          //feq=c2over27* (drho+three*(        -vx3)+c9over2*(        -vx3)*(        -vx3)-cu_sq); 
-//          //(D.f[d00P])[kt]=(one-q)/(one+q)*(f_B-feq*om_turb)/(one-om_turb)+(q*(f_B+f_T)-six*c2over27*(-VeloZ     ))/(one+q);
-//          //(D.f[d00P])[kt]=zero;
-//       }
-
-//       q = q_dirNE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          feq=c1o54* (drho/*+three*( vx1+vx2    )*/+c9o2*( vx1+vx2    )*( vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_NE+f_SW)-c6o1*c1o54*(VeloX+VeloY))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*( vx1+vx2    )+c9over2*( vx1+vx2    )*( vx1+vx2    )-cu_sq); 
-//          //(D.f[dMM0])[ksw]=(one-q)/(one+q)*(f_NE-feq*om_turb)/(one-om_turb)+(q*(f_NE+f_SW)-six*c1over54*(VeloX+VeloY))/(one+q);
-//          //(D.f[dMM0])[ksw]=zero;
-//       }
-
-//       q = q_dirSW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          feq=c1o54* (drho/*+three*(-vx1-vx2    )*/+c9o2*(-vx1-vx2    )*(-vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_SW+f_NE)-c6o1*c1o54*(-VeloX-VeloY))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(-vx1-vx2    )+c9over2*(-vx1-vx2    )*(-vx1-vx2    )-cu_sq); 
-//          //(D.f[dPP0])[kne]=(one-q)/(one+q)*(f_SW-feq*om_turb)/(one-om_turb)+(q*(f_SW+f_NE)-six*c1over54*(-VeloX-VeloY))/(one+q);
-//          //(D.f[dPP0])[kne]=zero;
-//       }
-
-//       q = q_dirSE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          feq=c1o54* (drho/*+three*( vx1-vx2    )*/+c9o2*( vx1-vx2    )*( vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_SE+f_NW)-c6o1*c1o54*( VeloX-VeloY))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*( vx1-vx2    )+c9over2*( vx1-vx2    )*( vx1-vx2    )-cu_sq); 
-//          //(D.f[dMP0])[knw]=(one-q)/(one+q)*(f_SE-feq*om_turb)/(one-om_turb)+(q*(f_SE+f_NW)-six*c1over54*( VeloX-VeloY))/(one+q);
-//          //(D.f[dMP0])[knw]=zero;
-//       }
-
-//       q = q_dirNW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          feq=c1o54* (drho/*+three*(-vx1+vx2    )*/+c9o2*(-vx1+vx2    )*(-vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_NW+f_SE)-c6o1*c1o54*(-VeloX+VeloY))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(-vx1+vx2    )+c9over2*(-vx1+vx2    )*(-vx1+vx2    )-cu_sq); 
-//          //(D.f[dPM0])[kse]=(one-q)/(one+q)*(f_NW-feq*om_turb)/(one-om_turb)+(q*(f_NW+f_SE)-six*c1over54*(-VeloX+VeloY))/(one+q);
-//          //(D.f[dPM0])[kse]=zero;
-//       }
-
-//       q = q_dirTE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//       //  if (k==10000) printf("AFTER x: %u \t  y: %u \t z: %u \n  VeloX: %f \t VeloY: %f \t VeloZ: %f \n\n", x,y,z, VeloX,VeloY,VeloZ);
-//          feq=c1o54* (drho/*+three*( vx1    +vx3)*/+c9o2*( vx1    +vx3)*( vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dM0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TE+f_BW)-c6o1*c1o54*( VeloX+VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*( vx1    +vx3)+c9over2*( vx1    +vx3)*( vx1    +vx3)-cu_sq); 
-//          //(D.f[dM0M])[kbw]=(one-q)/(one+q)*(f_TE-feq*om_turb)/(one-om_turb)+(q*(f_TE+f_BW)-six*c1over54*( VeloX+VeloZ))/(one+q);
-//          //(D.f[dM0M])[kbw]=zero;
-//       }
-
-//       q = q_dirBW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(-vx1    -vx3)*/+c9o2*(-vx1    -vx3)*(-vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dP0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BW+f_TE)-c6o1*c1o54*(-VeloX-VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(-vx1    -vx3)+c9over2*(-vx1    -vx3)*(-vx1    -vx3)-cu_sq); 
-//          //(D.f[dP0P])[kte]=(one-q)/(one+q)*(f_BW-feq*om_turb)/(one-om_turb)+(q*(f_BW+f_TE)-six*c1over54*(-VeloX-VeloZ))/(one+q);
-//          //(D.f[dP0P])[kte]=zero;
-//       }
-
-//       q = q_dirBE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*( vx1    -vx3)*/+c9o2*( vx1    -vx3)*( vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dM0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BE+f_TW)-c6o1*c1o54*( VeloX-VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*( vx1    -vx3)+c9over2*( vx1    -vx3)*( vx1    -vx3)-cu_sq); 
-//          //(D.f[dM0P])[ktw]=(one-q)/(one+q)*(f_BE-feq*om_turb)/(one-om_turb)+(q*(f_BE+f_TW)-six*c1over54*( VeloX-VeloZ))/(one+q);
-//          //(D.f[dM0P])[ktw]=zero;
-//       }
-
-//       q = q_dirTW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(-vx1    +vx3)*/+c9o2*(-vx1    +vx3)*(-vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dP0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TW+f_BE)-c6o1*c1o54*(-VeloX+VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(-vx1    +vx3)+c9over2*(-vx1    +vx3)*(-vx1    +vx3)-cu_sq); 
-//          //(D.f[dP0M])[kbe]=(one-q)/(one+q)*(f_TW-feq*om_turb)/(one-om_turb)+(q*(f_TW+f_BE)-six*c1over54*(-VeloX+VeloZ))/(one+q);
-//          //(D.f[dP0M])[kbe]=zero;
-//       }
-
-//       q = q_dirTN[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(     vx2+vx3)*/+c9o2*(     vx2+vx3)*(     vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TN+f_BS)-c6o1*c1o54*( VeloY+VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(     vx2+vx3)+c9over2*(     vx2+vx3)*(     vx2+vx3)-cu_sq); 
-//          //(D.f[d0MM])[kbs]=(one-q)/(one+q)*(f_TN-feq*om_turb)/(one-om_turb)+(q*(f_TN+f_BS)-six*c1over54*( VeloY+VeloZ))/(one+q);
-//          //(D.f[d0MM])[kbs]=zero;
-//       }
-
-//       q = q_dirBS[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(    -vx2-vx3)*/+c9o2*(    -vx2-vx3)*(    -vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BS+f_TN)-c6o1*c1o54*( -VeloY-VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(    -vx2-vx3)+c9over2*(    -vx2-vx3)*(    -vx2-vx3)-cu_sq); 
-//          //(D.f[d0PP])[ktn]=(one-q)/(one+q)*(f_BS-feq*om_turb)/(one-om_turb)+(q*(f_BS+f_TN)-six*c1over54*( -VeloY-VeloZ))/(one+q);
-//          //(D.f[d0PP])[ktn]=zero;
-//       }
-
-//       q = q_dirBN[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(     vx2-vx3)*/+c9o2*(     vx2-vx3)*(     vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BN+f_TS)-c6o1*c1o54*( VeloY-VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(     vx2-vx3)+c9over2*(     vx2-vx3)*(     vx2-vx3)-cu_sq); 
-//          //(D.f[d0MP])[kts]=(one-q)/(one+q)*(f_BN-feq*om_turb)/(one-om_turb)+(q*(f_BN+f_TS)-six*c1over54*( VeloY-VeloZ))/(one+q);
-//          //(D.f[d0MP])[kts]=zero;
-//       }
-
-//       q = q_dirTS[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o54* (drho/*+three*(    -vx2+vx3)*/+c9o2*(    -vx2+vx3)*(    -vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[d0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TS+f_BN)-c6o1*c1o54*( -VeloY+VeloZ))/(c1o1+q) - c1o54 * drho;
-//          //feq=c1over54* (drho+three*(    -vx2+vx3)+c9over2*(    -vx2+vx3)*(    -vx2+vx3)-cu_sq); 
-//          //(D.f[d0PM])[kbn]=(one-q)/(one+q)*(f_TS-feq*om_turb)/(one-om_turb)+(q*(f_TS+f_BN)-six*c1over54*( -VeloY+VeloZ))/(one+q);
-//          //(D.f[d0PM])[kbn]=zero;
-//       }
-
-//       q = q_dirTNE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*( vx1+vx2+vx3)*/+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TNE+f_BSW)-c6o1*c1o216*( VeloX+VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*( vx1+vx2+vx3)+c9over2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); 
-//          //(D.f[dMMM])[kbsw]=(one-q)/(one+q)*(f_TNE-feq*om_turb)/(one-om_turb)+(q*(f_TNE+f_BSW)-six*c1over216*( VeloX+VeloY+VeloZ))/(one+q);
-//          //(D.f[dMMM])[kbsw]=zero;
-//       }
-
-//       q = q_dirBSW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*(-vx1-vx2-vx3)*/+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BSW+f_TNE)-c6o1*c1o216*(-VeloX-VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*(-vx1-vx2-vx3)+c9over2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); 
-//          //(D.f[dPPP])[ktne]=(one-q)/(one+q)*(f_BSW-feq*om_turb)/(one-om_turb)+(q*(f_BSW+f_TNE)-six*c1over216*(-VeloX-VeloY-VeloZ))/(one+q);
-//          //(D.f[dPPP])[ktne]=zero;
-//       }
-
-//       q = q_dirBNE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*( vx1+vx2-vx3)*/+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BNE+f_TSW)-c6o1*c1o216*( VeloX+VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*( vx1+vx2-vx3)+c9over2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); 
-//          //(D.f[dMMP])[ktsw]=(one-q)/(one+q)*(f_BNE-feq*om_turb)/(one-om_turb)+(q*(f_BNE+f_TSW)-six*c1over216*( VeloX+VeloY-VeloZ))/(one+q);
-//          //(D.f[dMMP])[ktsw]=zero;
-//       }
-
-//       q = q_dirTSW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*(-vx1-vx2+vx3)*/+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TSW+f_BNE)-c6o1*c1o216*(-VeloX-VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*(-vx1-vx2+vx3)+c9over2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); 
-//          //(D.f[dPPM])[kbne]=(one-q)/(one+q)*(f_TSW-feq*om_turb)/(one-om_turb)+(q*(f_TSW+f_BNE)-six*c1over216*(-VeloX-VeloY+VeloZ))/(one+q);
-//          //(D.f[dPPM])[kbne]=zero;
-//       }
-
-//       q = q_dirTSE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*( vx1-vx2+vx3)*/+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TSE+f_BNW)-c6o1*c1o216*( VeloX-VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*( vx1-vx2+vx3)+c9over2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); 
-//          //(D.f[dMPM])[kbnw]=(one-q)/(one+q)*(f_TSE-feq*om_turb)/(one-om_turb)+(q*(f_TSE+f_BNW)-six*c1over216*( VeloX-VeloY+VeloZ))/(one+q);
-//          //(D.f[dMPM])[kbnw]=zero;
-//       }
-
-//       q = q_dirBNW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*(-vx1+vx2-vx3)*/+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BNW+f_TSE)-c6o1*c1o216*(-VeloX+VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*(-vx1+vx2-vx3)+c9over2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); 
-//          //(D.f[dPMP])[ktse]=(one-q)/(one+q)*(f_BNW-feq*om_turb)/(one-om_turb)+(q*(f_BNW+f_TSE)-six*c1over216*(-VeloX+VeloY-VeloZ))/(one+q);
-//          //(D.f[dPMP])[ktse]=zero;
-//       }
-
-//       q = q_dirBSE[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*( vx1-vx2-vx3)*/+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dMPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_BSE+f_TNW)-c6o1*c1o216*( VeloX-VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*( vx1-vx2-vx3)+c9over2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); 
-//          //(D.f[dMPP])[ktnw]=(one-q)/(one+q)*(f_BSE-feq*om_turb)/(one-om_turb)+(q*(f_BSE+f_TNW)-six*c1over216*( VeloX-VeloY-VeloZ))/(one+q);
-//          //(D.f[dMPP])[ktnw]=zero;
-//       }
-
-//       q = q_dirTNW[k];
-//       if (q>=c0o1 && q<=c1o1)
-//       {
-//          VeloX = fac*vx1;
-//          VeloY = fac*vx2;
-//          VeloZ = fac*vx3;
-//          if (x == true) VeloX = c0o1;
-//          if (y == true) VeloY = c0o1;
-//          if (z == true) VeloZ = c0o1;
-//          feq=c1o216*(drho/*+three*(-vx1+vx2+vx3)*/+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-//          (D.f[dPMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om_turb)/(c1o1-om_turb))*c1o2+(q*(f_TNW+f_BSE)-c6o1*c1o216*(-VeloX+VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-//          //feq=c1over216*(drho+three*(-vx1+vx2+vx3)+c9over2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); 
-//          //(D.f[dPMM])[kbse]=(one-q)/(one+q)*(f_TNW-feq*om_turb)/(one-om_turb)+(q*(f_TNW+f_BSE)-six*c1over216*(-VeloX+VeloY+VeloZ))/(one+q);
-//          //(D.f[dPMM])[kbse]=zero;
-//       }
-//    }
-// }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipGeomDeviceComp27(
-    real* DD, 
-    int* k_Q, 
-    real* QQ,
-    unsigned int  numberOfBCnodes,
-    real om1, 
-    real* NormalX,
-    real* NormalY,
-    real* NormalZ,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   Distributions27 D;
-   if (isEvenTimestep==true)
-   {
-      D.f[dP00] = &DD[dP00 * numberOfLBnodes];
-      D.f[dM00] = &DD[dM00 * numberOfLBnodes];
-      D.f[d0P0] = &DD[d0P0 * numberOfLBnodes];
-      D.f[d0M0] = &DD[d0M0 * numberOfLBnodes];
-      D.f[d00P] = &DD[d00P * numberOfLBnodes];
-      D.f[d00M] = &DD[d00M * numberOfLBnodes];
-      D.f[dPP0] = &DD[dPP0 * numberOfLBnodes];
-      D.f[dMM0] = &DD[dMM0 * numberOfLBnodes];
-      D.f[dPM0] = &DD[dPM0 * numberOfLBnodes];
-      D.f[dMP0] = &DD[dMP0 * numberOfLBnodes];
-      D.f[dP0P] = &DD[dP0P * numberOfLBnodes];
-      D.f[dM0M] = &DD[dM0M * numberOfLBnodes];
-      D.f[dP0M] = &DD[dP0M * numberOfLBnodes];
-      D.f[dM0P] = &DD[dM0P * numberOfLBnodes];
-      D.f[d0PP] = &DD[d0PP * numberOfLBnodes];
-      D.f[d0MM] = &DD[d0MM * numberOfLBnodes];
-      D.f[d0PM] = &DD[d0PM * numberOfLBnodes];
-      D.f[d0MP] = &DD[d0MP * numberOfLBnodes];
-      D.f[d000] = &DD[d000 * numberOfLBnodes];
-      D.f[dPPP] = &DD[dPPP * numberOfLBnodes];
-      D.f[dMMP] = &DD[dMMP * numberOfLBnodes];
-      D.f[dPMP] = &DD[dPMP * numberOfLBnodes];
-      D.f[dMPP] = &DD[dMPP * numberOfLBnodes];
-      D.f[dPPM] = &DD[dPPM * numberOfLBnodes];
-      D.f[dMMM] = &DD[dMMM * numberOfLBnodes];
-      D.f[dPMM] = &DD[dPMM * numberOfLBnodes];
-      D.f[dMPM] = &DD[dMPM * numberOfLBnodes];
-   } 
-   else
-   {
-      D.f[dM00] = &DD[dP00 * numberOfLBnodes];
-      D.f[dP00] = &DD[dM00 * numberOfLBnodes];
-      D.f[d0M0] = &DD[d0P0 * numberOfLBnodes];
-      D.f[d0P0] = &DD[d0M0 * numberOfLBnodes];
-      D.f[d00M] = &DD[d00P * numberOfLBnodes];
-      D.f[d00P] = &DD[d00M * numberOfLBnodes];
-      D.f[dMM0] = &DD[dPP0 * numberOfLBnodes];
-      D.f[dPP0] = &DD[dMM0 * numberOfLBnodes];
-      D.f[dMP0] = &DD[dPM0 * numberOfLBnodes];
-      D.f[dPM0] = &DD[dMP0 * numberOfLBnodes];
-      D.f[dM0M] = &DD[dP0P * numberOfLBnodes];
-      D.f[dP0P] = &DD[dM0M * numberOfLBnodes];
-      D.f[dM0P] = &DD[dP0M * numberOfLBnodes];
-      D.f[dP0M] = &DD[dM0P * numberOfLBnodes];
-      D.f[d0MM] = &DD[d0PP * numberOfLBnodes];
-      D.f[d0PP] = &DD[d0MM * numberOfLBnodes];
-      D.f[d0MP] = &DD[d0PM * numberOfLBnodes];
-      D.f[d0PM] = &DD[d0MP * numberOfLBnodes];
-      D.f[d000] = &DD[d000 * numberOfLBnodes];
-      D.f[dPPP] = &DD[dMMM * numberOfLBnodes];
-      D.f[dMMP] = &DD[dPPM * numberOfLBnodes];
-      D.f[dPMP] = &DD[dMPM * numberOfLBnodes];
-      D.f[dMPP] = &DD[dPMM * numberOfLBnodes];
-      D.f[dPPM] = &DD[dMMP * numberOfLBnodes];
-      D.f[dMMM] = &DD[dPPP * numberOfLBnodes];
-      D.f[dPMM] = &DD[dMPP * numberOfLBnodes];
-      D.f[dMPM] = &DD[dPMP * numberOfLBnodes];
-   }
-   ////////////////////////////////////////////////////////////////////////////////
-   const unsigned  x = threadIdx.x;  // Globaler x-Index 
-   const unsigned  y = blockIdx.x;   // Globaler y-Index 
-   const unsigned  z = blockIdx.y;   // Globaler z-Index 
-
-   const unsigned nx = blockDim.x;
-   const unsigned ny = gridDim.x;
-
-   const unsigned k = nx*(ny*z + y) + x;
-   //////////////////////////////////////////////////////////////////////////
-
-   if(k< numberOfBCnodes)
-   {
-      ////////////////////////////////////////////////////////////////////////////////
-      real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
-            *q_dirNE,  *q_dirSW,  *q_dirSE,  *q_dirNW,  *q_dirTE,  *q_dirBW,
-            *q_dirBE,  *q_dirTW,  *q_dirTN,  *q_dirBS,  *q_dirBN,  *q_dirTS,
-            *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
-            *q_dirBSE, *q_dirBNW; 
-      q_dirE   = &QQ[dP00 * numberOfBCnodes];
-      q_dirW   = &QQ[dM00 * numberOfBCnodes];
-      q_dirN   = &QQ[d0P0 * numberOfBCnodes];
-      q_dirS   = &QQ[d0M0 * numberOfBCnodes];
-      q_dirT   = &QQ[d00P * numberOfBCnodes];
-      q_dirB   = &QQ[d00M * numberOfBCnodes];
-      q_dirNE  = &QQ[dPP0 * numberOfBCnodes];
-      q_dirSW  = &QQ[dMM0 * numberOfBCnodes];
-      q_dirSE  = &QQ[dPM0 * numberOfBCnodes];
-      q_dirNW  = &QQ[dMP0 * numberOfBCnodes];
-      q_dirTE  = &QQ[dP0P * numberOfBCnodes];
-      q_dirBW  = &QQ[dM0M * numberOfBCnodes];
-      q_dirBE  = &QQ[dP0M * numberOfBCnodes];
-      q_dirTW  = &QQ[dM0P * numberOfBCnodes];
-      q_dirTN  = &QQ[d0PP * numberOfBCnodes];
-      q_dirBS  = &QQ[d0MM * numberOfBCnodes];
-      q_dirBN  = &QQ[d0PM * numberOfBCnodes];
-      q_dirTS  = &QQ[d0MP * numberOfBCnodes];
-      q_dirTNE = &QQ[dPPP * numberOfBCnodes];
-      q_dirTSW = &QQ[dMMP * numberOfBCnodes];
-      q_dirTSE = &QQ[dPMP * numberOfBCnodes];
-      q_dirTNW = &QQ[dMPP * numberOfBCnodes];
-      q_dirBNE = &QQ[dPPM * numberOfBCnodes];
-      q_dirBSW = &QQ[dMMM * numberOfBCnodes];
-      q_dirBSE = &QQ[dPMM * numberOfBCnodes];
-      q_dirBNW = &QQ[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *nx_dirE,   *nx_dirW,   *nx_dirN,   *nx_dirS,   *nx_dirT,   *nx_dirB, 
-              *nx_dirNE,  *nx_dirSW,  *nx_dirSE,  *nx_dirNW,  *nx_dirTE,  *nx_dirBW,
-              *nx_dirBE,  *nx_dirTW,  *nx_dirTN,  *nx_dirBS,  *nx_dirBN,  *nx_dirTS,
-              *nx_dirTNE, *nx_dirTSW, *nx_dirTSE, *nx_dirTNW, *nx_dirBNE, *nx_dirBSW,
-              *nx_dirBSE, *nx_dirBNW; 
-      nx_dirE   = &NormalX[dP00 * numberOfBCnodes];
-      nx_dirW   = &NormalX[dM00 * numberOfBCnodes];
-      nx_dirN   = &NormalX[d0P0 * numberOfBCnodes];
-      nx_dirS   = &NormalX[d0M0 * numberOfBCnodes];
-      nx_dirT   = &NormalX[d00P * numberOfBCnodes];
-      nx_dirB   = &NormalX[d00M * numberOfBCnodes];
-      nx_dirNE  = &NormalX[dPP0 * numberOfBCnodes];
-      nx_dirSW  = &NormalX[dMM0 * numberOfBCnodes];
-      nx_dirSE  = &NormalX[dPM0 * numberOfBCnodes];
-      nx_dirNW  = &NormalX[dMP0 * numberOfBCnodes];
-      nx_dirTE  = &NormalX[dP0P * numberOfBCnodes];
-      nx_dirBW  = &NormalX[dM0M * numberOfBCnodes];
-      nx_dirBE  = &NormalX[dP0M * numberOfBCnodes];
-      nx_dirTW  = &NormalX[dM0P * numberOfBCnodes];
-      nx_dirTN  = &NormalX[d0PP * numberOfBCnodes];
-      nx_dirBS  = &NormalX[d0MM * numberOfBCnodes];
-      nx_dirBN  = &NormalX[d0PM * numberOfBCnodes];
-      nx_dirTS  = &NormalX[d0MP * numberOfBCnodes];
-      nx_dirTNE = &NormalX[dPPP * numberOfBCnodes];
-      nx_dirTSW = &NormalX[dMMP * numberOfBCnodes];
-      nx_dirTSE = &NormalX[dPMP * numberOfBCnodes];
-      nx_dirTNW = &NormalX[dMPP * numberOfBCnodes];
-      nx_dirBNE = &NormalX[dPPM * numberOfBCnodes];
-      nx_dirBSW = &NormalX[dMMM * numberOfBCnodes];
-      nx_dirBSE = &NormalX[dPMM * numberOfBCnodes];
-      nx_dirBNW = &NormalX[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *ny_dirE,   *ny_dirW,   *ny_dirN,   *ny_dirS,   *ny_dirT,   *ny_dirB, 
-              *ny_dirNE,  *ny_dirSW,  *ny_dirSE,  *ny_dirNW,  *ny_dirTE,  *ny_dirBW,
-              *ny_dirBE,  *ny_dirTW,  *ny_dirTN,  *ny_dirBS,  *ny_dirBN,  *ny_dirTS,
-              *ny_dirTNE, *ny_dirTSW, *ny_dirTSE, *ny_dirTNW, *ny_dirBNE, *ny_dirBSW,
-              *ny_dirBSE, *ny_dirBNW; 
-      ny_dirE   = &NormalY[dP00 * numberOfBCnodes];
-      ny_dirW   = &NormalY[dM00 * numberOfBCnodes];
-      ny_dirN   = &NormalY[d0P0 * numberOfBCnodes];
-      ny_dirS   = &NormalY[d0M0 * numberOfBCnodes];
-      ny_dirT   = &NormalY[d00P * numberOfBCnodes];
-      ny_dirB   = &NormalY[d00M * numberOfBCnodes];
-      ny_dirNE  = &NormalY[dPP0 * numberOfBCnodes];
-      ny_dirSW  = &NormalY[dMM0 * numberOfBCnodes];
-      ny_dirSE  = &NormalY[dPM0 * numberOfBCnodes];
-      ny_dirNW  = &NormalY[dMP0 * numberOfBCnodes];
-      ny_dirTE  = &NormalY[dP0P * numberOfBCnodes];
-      ny_dirBW  = &NormalY[dM0M * numberOfBCnodes];
-      ny_dirBE  = &NormalY[dP0M * numberOfBCnodes];
-      ny_dirTW  = &NormalY[dM0P * numberOfBCnodes];
-      ny_dirTN  = &NormalY[d0PP * numberOfBCnodes];
-      ny_dirBS  = &NormalY[d0MM * numberOfBCnodes];
-      ny_dirBN  = &NormalY[d0PM * numberOfBCnodes];
-      ny_dirTS  = &NormalY[d0MP * numberOfBCnodes];
-      ny_dirTNE = &NormalY[dPPP * numberOfBCnodes];
-      ny_dirTSW = &NormalY[dMMP * numberOfBCnodes];
-      ny_dirTSE = &NormalY[dPMP * numberOfBCnodes];
-      ny_dirTNW = &NormalY[dMPP * numberOfBCnodes];
-      ny_dirBNE = &NormalY[dPPM * numberOfBCnodes];
-      ny_dirBSW = &NormalY[dMMM * numberOfBCnodes];
-      ny_dirBSE = &NormalY[dPMM * numberOfBCnodes];
-      ny_dirBNW = &NormalY[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *nz_dirE,   *nz_dirW,   *nz_dirN,   *nz_dirS,   *nz_dirT,   *nz_dirB, 
-              *nz_dirNE,  *nz_dirSW,  *nz_dirSE,  *nz_dirNW,  *nz_dirTE,  *nz_dirBW,
-              *nz_dirBE,  *nz_dirTW,  *nz_dirTN,  *nz_dirBS,  *nz_dirBN,  *nz_dirTS,
-              *nz_dirTNE, *nz_dirTSW, *nz_dirTSE, *nz_dirTNW, *nz_dirBNE, *nz_dirBSW,
-              *nz_dirBSE, *nz_dirBNW; 
-      nz_dirE   = &NormalZ[dP00 * numberOfBCnodes];
-      nz_dirW   = &NormalZ[dM00 * numberOfBCnodes];
-      nz_dirN   = &NormalZ[d0P0 * numberOfBCnodes];
-      nz_dirS   = &NormalZ[d0M0 * numberOfBCnodes];
-      nz_dirT   = &NormalZ[d00P * numberOfBCnodes];
-      nz_dirB   = &NormalZ[d00M * numberOfBCnodes];
-      nz_dirNE  = &NormalZ[dPP0 * numberOfBCnodes];
-      nz_dirSW  = &NormalZ[dMM0 * numberOfBCnodes];
-      nz_dirSE  = &NormalZ[dPM0 * numberOfBCnodes];
-      nz_dirNW  = &NormalZ[dMP0 * numberOfBCnodes];
-      nz_dirTE  = &NormalZ[dP0P * numberOfBCnodes];
-      nz_dirBW  = &NormalZ[dM0M * numberOfBCnodes];
-      nz_dirBE  = &NormalZ[dP0M * numberOfBCnodes];
-      nz_dirTW  = &NormalZ[dM0P * numberOfBCnodes];
-      nz_dirTN  = &NormalZ[d0PP * numberOfBCnodes];
-      nz_dirBS  = &NormalZ[d0MM * numberOfBCnodes];
-      nz_dirBN  = &NormalZ[d0PM * numberOfBCnodes];
-      nz_dirTS  = &NormalZ[d0MP * numberOfBCnodes];
-      nz_dirTNE = &NormalZ[dPPP * numberOfBCnodes];
-      nz_dirTSW = &NormalZ[dMMP * numberOfBCnodes];
-      nz_dirTSE = &NormalZ[dPMP * numberOfBCnodes];
-      nz_dirTNW = &NormalZ[dMPP * numberOfBCnodes];
-      nz_dirBNE = &NormalZ[dPPM * numberOfBCnodes];
-      nz_dirBSW = &NormalZ[dMMM * numberOfBCnodes];
-      nz_dirBSE = &NormalZ[dPMM * numberOfBCnodes];
-      nz_dirBNW = &NormalZ[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      //index
-      unsigned int KQK  = k_Q[k];
-      unsigned int kzero= KQK;
-      unsigned int ke   = KQK;
-      unsigned int kw   = neighborX[KQK];
-      unsigned int kn   = KQK;
-      unsigned int ks   = neighborY[KQK];
-      unsigned int kt   = KQK;
-      unsigned int kb   = neighborZ[KQK];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = KQK;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = KQK;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = KQK;
-      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 = KQK;
-      unsigned int kbsw = neighborZ[ksw];
-      ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[dP00])[ke   ];
-      real f_E    = (D.f[dM00])[kw   ];
-      real f_S    = (D.f[d0P0])[kn   ];
-      real f_N    = (D.f[d0M0])[ks   ];
-      real f_B    = (D.f[d00P])[kt   ];
-      real f_T    = (D.f[d00M])[kb   ];
-      real f_SW   = (D.f[dPP0])[kne  ];
-      real f_NE   = (D.f[dMM0])[ksw  ];
-      real f_NW   = (D.f[dPM0])[kse  ];
-      real f_SE   = (D.f[dMP0])[knw  ];
-      real f_BW   = (D.f[dP0P])[kte  ];
-      real f_TE   = (D.f[dM0M])[kbw  ];
-      real f_TW   = (D.f[dP0M])[kbe  ];
-      real f_BE   = (D.f[dM0P])[ktw  ];
-      real f_BS   = (D.f[d0PP])[ktn  ];
-      real f_TN   = (D.f[d0MM])[kbs  ];
-      real f_TS   = (D.f[d0PM])[kbn  ];
-      real f_BN   = (D.f[d0MP])[kts  ];
-      real f_BSW  = (D.f[dPPP])[ktne ];
-      real f_BNE  = (D.f[dMMP])[ktsw ];
-      real f_BNW  = (D.f[dPMP])[ktse ];
-      real f_BSE  = (D.f[dMPP])[ktnw ];
-      real f_TSW  = (D.f[dPPM])[kbne ];
-      real f_TNE  = (D.f[dMMM])[kbsw ];
-      real f_TNW  = (D.f[dPMM])[kbse ];
-      real f_TSE  = (D.f[dMPM])[kbnw ];
-      ////////////////////////////////////////////////////////////////////////////////
-      real vx1, vx2, vx3, drho, feq, q;
-      drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[d000])[kzero]); 
-
-      vx1    =  (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                (f_E - f_W)) / (c1o1 + drho); 
-         
-
-      vx2    =   ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                 ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                 (f_N - f_S)) / (c1o1 + drho); 
-
-      vx3    =   (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                 (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                 (f_T - f_B)) / (c1o1 + drho); 
-
-      real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3) * (c1o1 + drho);
-
-      //////////////////////////////////////////////////////////////////////////
-      if (isEvenTimestep==false)
-      {
-         D.f[dP00] = &DD[dP00 * numberOfLBnodes];
-         D.f[dM00] = &DD[dM00 * numberOfLBnodes];
-         D.f[d0P0] = &DD[d0P0 * numberOfLBnodes];
-         D.f[d0M0] = &DD[d0M0 * numberOfLBnodes];
-         D.f[d00P] = &DD[d00P * numberOfLBnodes];
-         D.f[d00M] = &DD[d00M * numberOfLBnodes];
-         D.f[dPP0] = &DD[dPP0 * numberOfLBnodes];
-         D.f[dMM0] = &DD[dMM0 * numberOfLBnodes];
-         D.f[dPM0] = &DD[dPM0 * numberOfLBnodes];
-         D.f[dMP0] = &DD[dMP0 * numberOfLBnodes];
-         D.f[dP0P] = &DD[dP0P * numberOfLBnodes];
-         D.f[dM0M] = &DD[dM0M * numberOfLBnodes];
-         D.f[dP0M] = &DD[dP0M * numberOfLBnodes];
-         D.f[dM0P] = &DD[dM0P * numberOfLBnodes];
-         D.f[d0PP] = &DD[d0PP * numberOfLBnodes];
-         D.f[d0MM] = &DD[d0MM * numberOfLBnodes];
-         D.f[d0PM] = &DD[d0PM * numberOfLBnodes];
-         D.f[d0MP] = &DD[d0MP * numberOfLBnodes];
-         D.f[d000] = &DD[d000 * numberOfLBnodes];
-         D.f[dPPP] = &DD[dPPP * numberOfLBnodes];
-         D.f[dMMP] = &DD[dMMP * numberOfLBnodes];
-         D.f[dPMP] = &DD[dPMP * numberOfLBnodes];
-         D.f[dMPP] = &DD[dMPP * numberOfLBnodes];
-         D.f[dPPM] = &DD[dPPM * numberOfLBnodes];
-         D.f[dMMM] = &DD[dMMM * numberOfLBnodes];
-         D.f[dPMM] = &DD[dPMM * numberOfLBnodes];
-         D.f[dMPM] = &DD[dMPM * numberOfLBnodes];
-      } 
-      else
-      {
-         D.f[dM00] = &DD[dP00 * numberOfLBnodes];
-         D.f[dP00] = &DD[dM00 * numberOfLBnodes];
-         D.f[d0M0] = &DD[d0P0 * numberOfLBnodes];
-         D.f[d0P0] = &DD[d0M0 * numberOfLBnodes];
-         D.f[d00M] = &DD[d00P * numberOfLBnodes];
-         D.f[d00P] = &DD[d00M * numberOfLBnodes];
-         D.f[dMM0] = &DD[dPP0 * numberOfLBnodes];
-         D.f[dPP0] = &DD[dMM0 * numberOfLBnodes];
-         D.f[dMP0] = &DD[dPM0 * numberOfLBnodes];
-         D.f[dPM0] = &DD[dMP0 * numberOfLBnodes];
-         D.f[dM0M] = &DD[dP0P * numberOfLBnodes];
-         D.f[dP0P] = &DD[dM0M * numberOfLBnodes];
-         D.f[dM0P] = &DD[dP0M * numberOfLBnodes];
-         D.f[dP0M] = &DD[dM0P * numberOfLBnodes];
-         D.f[d0MM] = &DD[d0PP * numberOfLBnodes];
-         D.f[d0PP] = &DD[d0MM * numberOfLBnodes];
-         D.f[d0MP] = &DD[d0PM * numberOfLBnodes];
-         D.f[d0PM] = &DD[d0MP * numberOfLBnodes];
-         D.f[d000] = &DD[d000 * numberOfLBnodes];
-         D.f[dPPP] = &DD[dMMM * numberOfLBnodes];
-         D.f[dMMP] = &DD[dPPM * numberOfLBnodes];
-         D.f[dPMP] = &DD[dMPM * numberOfLBnodes];
-         D.f[dMPP] = &DD[dPMM * numberOfLBnodes];
-         D.f[dPPM] = &DD[dMMP * numberOfLBnodes];
-         D.f[dMMM] = &DD[dPPP * numberOfLBnodes];
-         D.f[dPMM] = &DD[dMPP * numberOfLBnodes];
-         D.f[dMPM] = &DD[dPMP * numberOfLBnodes];
-      }
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real VeloX = vx1;
-      real VeloY = vx2;
-      real VeloZ = vx3;
-      real fac = c0o1;//0.5;
-       real phi = c0o1;
-      //real alpha = c1o100;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real kxyFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (c1o1 + drho) - ((vx1*vx2)));
-      real kyzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (c1o1 + drho) - ((vx2*vx3)));
-      real kxzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (c1o1 + drho) - ((vx1*vx3)));
-
-      real kxxFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_E+f_NE+f_SE+f_TE+f_BE+f_W+f_NW+f_SW+f_TW+f_BW+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx1*vx1)));
-      real kyyFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_N+f_NE+f_NW+f_TN+f_BN+f_S+f_SE+f_SW+f_TS+f_BS+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx2*vx2)));
-      real kzzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_T+f_TE+f_TW+f_TN+f_BS+f_B+f_BE+f_BW+f_BN+f_BS+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx3*vx3)));
-
-      real magS = sqrtf(kxyFromfcNEQ*kxyFromfcNEQ + kyzFromfcNEQ*kyzFromfcNEQ + kxzFromfcNEQ*kxzFromfcNEQ + kxxFromfcNEQ*kxxFromfcNEQ + kyyFromfcNEQ*kyyFromfcNEQ + kzzFromfcNEQ*kzzFromfcNEQ);
-
-      //fac = fac * magS / (c1o3 * (one / om1 - c1o2));
-   //   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real *facAst = &QQ[d000 * numberOfBCnodes];
-
-      //fac = fac * alpha + facAst[k] * (one - alpha);
-      //facAst[k] = fac;
-      //(&QQ[d000 * numberOfBCnodes])[KQK] = fac;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      ////real uk = sqrtf(vx1*vx1 + vx2*vx2 + vx3*vx3);
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real phi = expf(magS/0.01f) - one;
-      //phi = (phi > one) ? one:phi;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real C = five;
-      //real kappa = 0.41f;
-      //real phi = (C * kappa * c1o2 * logf(magS / (c1o3 * (one / om1 - c1o2))) - one) / (C * kappa * c1o2 * logf(magS / (c1o3 * (one / om1 - c1o2))));
-      //phi = (phi < zero) ? zero:phi;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real sum = zero, count = zero;
-   //   q = q_dirE   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirE[k] ); count += one;
-   //   q = q_dirW   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirW[k])); count += one;
-   //   q = q_dirN   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirN[k] ); count += one;
-   //   q = q_dirS   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirS[k])); count += one;
-   //   q = q_dirT   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirT[k] ); count += one;
-   //   q = q_dirB   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirB[k])); count += one;
-   //   q = q_dirNE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirNE[k]  + ny_dirNE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirSW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirSW[k]) - ny_dirSW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirSE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirSE[k]  - ny_dirSE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirNW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirNW[k]) + ny_dirNW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTE[k]  + nz_dirTE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBW[k]) - nz_dirBW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBE[k]  - nz_dirBE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTW[k]) + nz_dirTW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTN  [k]; if (q>=zero && q<=one) sum += (q * (  ny_dirTN[k]  + nz_dirTN[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBS  [k]; if (q>=zero && q<=one) sum += (q * ((-ny_dirBS[k]) - nz_dirBS[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBN  [k]; if (q>=zero && q<=one) sum += (q * (  ny_dirBN[k]  - nz_dirBN[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTS  [k]; if (q>=zero && q<=one) sum += (q * ((-ny_dirTS[k]) + nz_dirTS[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTNE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTNE[k] + ny_dirTNE[k] + nz_dirTNE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTSW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTSW[k])- ny_dirTSW[k] + nz_dirTSW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTSE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTSE[k] - ny_dirTSE[k] + nz_dirTSE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTNW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTNW[k])+ ny_dirTNW[k] + nz_dirTNW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBNE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBNE[k] + ny_dirBNE[k] - nz_dirBNE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBSW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBSW[k])- ny_dirBSW[k] - nz_dirBSW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBSE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBSE[k] - ny_dirBSE[k] - nz_dirBSE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBNW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBNW[k])+ ny_dirBNW[k] - nz_dirBNW[k])/(sqrtf(three))); count += one;
-      //real qMed = sum/count;
-      //real phi = fac / (qMed + fac);
-      //phi = (phi > one) ? one:one;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real testQ = c2o1;
-
-      q = q_dirE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirE[k] + vx2 * ny_dirE[k] + vx3 * nz_dirE[k]) * nx_dirE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirE[k]) + fac);
-         VeloX *= phi;
-         feq=c2o27* (drho/*+three*( vx1        )*/+c9o2*( vx1        )*( vx1        ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W)-c6o1*c2o27*( VeloX     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirW[k] + vx2 * ny_dirW[k] + vx3 * nz_dirW[k]) * nx_dirW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirW[k]) + fac);
-         VeloX *= phi;
-         feq=c2o27* (drho/*+three*(-vx1        )*/+c9o2*(-vx1        )*(-vx1        ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E)-c6o1*c2o27*(-VeloX     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirN[k] + vx2 * ny_dirN[k] + vx3 * nz_dirN[k]) * ny_dirN[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( ny_dirN[k]) + fac);
-         VeloY *= phi;
-         feq=c2o27* (drho/*+three*(    vx2     )*/+c9o2*(     vx2    )*(     vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S)-c6o1*c2o27*( VeloY     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirS[k] + vx2 * ny_dirS[k] + vx3 * nz_dirS[k]) * ny_dirS[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-ny_dirS[k]) + fac);
-         VeloY *= phi;
-         feq=c2o27* (drho/*+three*(   -vx2     )*/+c9o2*(    -vx2    )*(    -vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N)-c6o1*c2o27*(-VeloY     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirT[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = vx3 - (vx1 * nx_dirT[k] + vx2 * ny_dirT[k] + vx3 * nz_dirT[k]) * nz_dirT[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nz_dirT[k]) + fac);
-         VeloZ *= phi;
-         feq=c2o27* (drho/*+three*(         vx3)*/+c9o2*(         vx3)*(         vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B)-c6o1*c2o27*( VeloZ     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirB[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = vx3 - (vx1 * nx_dirB[k] + vx2 * ny_dirB[k] + vx3 * nz_dirB[k]) * nz_dirB[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nz_dirB[k]) + fac);
-         VeloZ *= phi;
-         feq=c2o27* (drho/*+three*(        -vx3)*/+c9o2*(        -vx3)*(        -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T)-c6o1*c2o27*(-VeloZ     ))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * nx_dirNE[k];
-         VeloY = vx2 - (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * ny_dirNE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirNE[k] + ny_dirNE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         feq=c1o54* (drho/*+three*( vx1+vx2    )*/+c9o2*( vx1+vx2    )*( vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW)-c6o1*c1o54*(VeloX+VeloY))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * nx_dirSW[k];
-         VeloY = vx2 - (vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * ny_dirSW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirSW[k] - ny_dirSW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         feq=c1o54* (drho/*+three*(-vx1-vx2    )*/+c9o2*(-vx1-vx2    )*(-vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE)-c6o1*c1o54*(-VeloX-VeloY))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * nx_dirSE[k];
-         VeloY = vx2 - (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * ny_dirSE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirSE[k] - ny_dirSE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         feq=c1o54* (drho/*+three*( vx1-vx2    )*/+c9o2*( vx1-vx2    )*( vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW)-c6o1*c1o54*( VeloX-VeloY))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * nx_dirNW[k];
-         VeloY = vx2 - (vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * ny_dirNW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirNW[k] + ny_dirNW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         feq=c1o54* (drho/*+three*(-vx1+vx2    )*/+c9o2*(-vx1+vx2    )*(-vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE)-c6o1*c1o54*(-VeloX+VeloY))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nx_dirTE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nz_dirTE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirTE[k] + nz_dirTE[k]) + fac);
-         VeloX *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*( vx1    +vx3)*/+c9o2*( vx1    +vx3)*( vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW)-c6o1*c1o54*( VeloX+VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nx_dirBW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nz_dirBW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirBW[k] - nz_dirBW[k]) + fac);
-         VeloX *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(-vx1    -vx3)*/+c9o2*(-vx1    -vx3)*(-vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE)-c6o1*c1o54*(-VeloX-VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nx_dirBE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nz_dirBE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirBE[k] - nz_dirBE[k]) + fac);
-         VeloX *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*( vx1    -vx3)*/+c9o2*( vx1    -vx3)*( vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW)-c6o1*c1o54*( VeloX-VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nx_dirTW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nz_dirTW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirTW[k] + nz_dirTW[k]) + fac);
-         VeloX *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(-vx1    +vx3)*/+c9o2*(-vx1    +vx3)*(-vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE)-c6o1*c1o54*(-VeloX+VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * ny_dirTN[k];
-         VeloZ = vx3 - (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * nz_dirTN[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( ny_dirTN[k] + nz_dirTN[k]) + fac);
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(     vx2+vx3)*/+c9o2*(     vx2+vx3)*(     vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS)-c6o1*c1o54*( VeloY+VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * ny_dirBS[k];
-         VeloZ = vx3 - (vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * nz_dirBS[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-ny_dirBS[k] - nz_dirBS[k]) + fac);
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(    -vx2-vx3)*/+c9o2*(    -vx2-vx3)*(    -vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN)-c6o1*c1o54*( -VeloY-VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * ny_dirBN[k];
-         VeloZ = vx3 - (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * nz_dirBN[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( ny_dirBN[k] - nz_dirBN[k]) + fac);
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(     vx2-vx3)*/+c9o2*(     vx2-vx3)*(     vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS)-c6o1*c1o54*( VeloY-VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * ny_dirTS[k];
-         VeloZ = vx3 - (vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * nz_dirTS[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-ny_dirTS[k] + nz_dirTS[k]) + fac);
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o54* (drho/*+three*(    -vx2+vx3)*/+c9o2*(    -vx2+vx3)*(    -vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN)-c6o1*c1o54*( -VeloY+VeloZ))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nx_dirTNE[k];
-         VeloY = vx2 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * ny_dirTNE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nz_dirTNE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirTNE[k] + ny_dirTNE[k] + nz_dirTNE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*( vx1+vx2+vx3)*/+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW)-c6o1*c1o216*( VeloX+VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nx_dirBSW[k];
-         VeloY = vx2 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * ny_dirBSW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nz_dirBSW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirBSW[k] - ny_dirBSW[k] - nz_dirBSW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*(-vx1-vx2-vx3)*/+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE)-c6o1*c1o216*(-VeloX-VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nx_dirBNE[k];
-         VeloY = vx2 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * ny_dirBNE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nz_dirBNE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirBNE[k] + ny_dirBNE[k] - nz_dirBNE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*( vx1+vx2-vx3)*/+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW)-c6o1*c1o216*( VeloX+VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nx_dirTSW[k];
-         VeloY = vx2 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * ny_dirTSW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nz_dirTSW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirTSW[k] - ny_dirTSW[k] + nz_dirTSW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*(-vx1-vx2+vx3)*/+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE)-c6o1*c1o216*(-VeloX-VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nx_dirTSE[k];
-         VeloY = vx2 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * ny_dirTSE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nz_dirTSE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirTSE[k] - ny_dirTSE[k] + nz_dirTSE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*( vx1-vx2+vx3)*/+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW)-c6o1*c1o216*( VeloX-VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nx_dirBNW[k];
-         VeloY = vx2 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * ny_dirBNW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nz_dirBNW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirBNW[k] + ny_dirBNW[k] - nz_dirBNW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*(-vx1+vx2-vx3)*/+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE)-c6o1*c1o216*(-VeloX+VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nx_dirBSE[k];
-         VeloY = vx2 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * ny_dirBSE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nz_dirBSE[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = (phi > one) ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs( nx_dirBSE[k] - ny_dirBSE[k] - nz_dirBSE[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*( vx1-vx2-vx3)*/+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW)-c6o1*c1o216*( VeloX-VeloY-VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nx_dirTNW[k];
-         VeloY = vx2 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * ny_dirTNW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nz_dirTNW[k];
-         //phi = fac * (one + magS / (c0p0000002+uk) * (one-q));
-         //phi = phi > one ? one:phi;
-         //phi = fac; //Test
-         q = testQ; //AAAAHHHHHH bitte wieder raus nehmen!!!!
-         phi = fac / (q * fabs(-nx_dirTNW[k] + ny_dirTNW[k] + nz_dirTNW[k]) + fac);
-         VeloX *= phi;
-         VeloY *= phi;
-         VeloZ *= phi;
-         feq=c1o216*(drho/*+three*(-vx1+vx2+vx3)*/+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE)-c6o1*c1o216*(-VeloX+VeloY+VeloZ))/(c1o1+q) - c1o216 * drho;
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-__global__ void QSlipNormDeviceComp27(
-    real* DD, 
-    int* k_Q, 
-    real* QQ,
-    unsigned int  numberOfBCnodes,
-    real om1, 
-    real* NormalX,
-    real* NormalY,
-    real* NormalZ,
-    unsigned int* neighborX,
-    unsigned int* neighborY,
-    unsigned int* neighborZ,
-    unsigned long long numberOfLBnodes, 
-    bool isEvenTimestep)
-{
-   Distributions27 D;
-   if (isEvenTimestep==true)
-   {
-      D.f[dP00] = &DD[dP00 * numberOfLBnodes];
-      D.f[dM00] = &DD[dM00 * numberOfLBnodes];
-      D.f[d0P0] = &DD[d0P0 * numberOfLBnodes];
-      D.f[d0M0] = &DD[d0M0 * numberOfLBnodes];
-      D.f[d00P] = &DD[d00P * numberOfLBnodes];
-      D.f[d00M] = &DD[d00M * numberOfLBnodes];
-      D.f[dPP0] = &DD[dPP0 * numberOfLBnodes];
-      D.f[dMM0] = &DD[dMM0 * numberOfLBnodes];
-      D.f[dPM0] = &DD[dPM0 * numberOfLBnodes];
-      D.f[dMP0] = &DD[dMP0 * numberOfLBnodes];
-      D.f[dP0P] = &DD[dP0P * numberOfLBnodes];
-      D.f[dM0M] = &DD[dM0M * numberOfLBnodes];
-      D.f[dP0M] = &DD[dP0M * numberOfLBnodes];
-      D.f[dM0P] = &DD[dM0P * numberOfLBnodes];
-      D.f[d0PP] = &DD[d0PP * numberOfLBnodes];
-      D.f[d0MM] = &DD[d0MM * numberOfLBnodes];
-      D.f[d0PM] = &DD[d0PM * numberOfLBnodes];
-      D.f[d0MP] = &DD[d0MP * numberOfLBnodes];
-      D.f[d000] = &DD[d000 * numberOfLBnodes];
-      D.f[dPPP] = &DD[dPPP * numberOfLBnodes];
-      D.f[dMMP] = &DD[dMMP * numberOfLBnodes];
-      D.f[dPMP] = &DD[dPMP * numberOfLBnodes];
-      D.f[dMPP] = &DD[dMPP * numberOfLBnodes];
-      D.f[dPPM] = &DD[dPPM * numberOfLBnodes];
-      D.f[dMMM] = &DD[dMMM * numberOfLBnodes];
-      D.f[dPMM] = &DD[dPMM * numberOfLBnodes];
-      D.f[dMPM] = &DD[dMPM * numberOfLBnodes];
-   } 
-   else
-   {
-      D.f[dM00] = &DD[dP00 * numberOfLBnodes];
-      D.f[dP00] = &DD[dM00 * numberOfLBnodes];
-      D.f[d0M0] = &DD[d0P0 * numberOfLBnodes];
-      D.f[d0P0] = &DD[d0M0 * numberOfLBnodes];
-      D.f[d00M] = &DD[d00P * numberOfLBnodes];
-      D.f[d00P] = &DD[d00M * numberOfLBnodes];
-      D.f[dMM0] = &DD[dPP0 * numberOfLBnodes];
-      D.f[dPP0] = &DD[dMM0 * numberOfLBnodes];
-      D.f[dMP0] = &DD[dPM0 * numberOfLBnodes];
-      D.f[dPM0] = &DD[dMP0 * numberOfLBnodes];
-      D.f[dM0M] = &DD[dP0P * numberOfLBnodes];
-      D.f[dP0P] = &DD[dM0M * numberOfLBnodes];
-      D.f[dM0P] = &DD[dP0M * numberOfLBnodes];
-      D.f[dP0M] = &DD[dM0P * numberOfLBnodes];
-      D.f[d0MM] = &DD[d0PP * numberOfLBnodes];
-      D.f[d0PP] = &DD[d0MM * numberOfLBnodes];
-      D.f[d0MP] = &DD[d0PM * numberOfLBnodes];
-      D.f[d0PM] = &DD[d0MP * numberOfLBnodes];
-      D.f[d000] = &DD[d000 * numberOfLBnodes];
-      D.f[dPPP] = &DD[dMMM * numberOfLBnodes];
-      D.f[dMMP] = &DD[dPPM * numberOfLBnodes];
-      D.f[dPMP] = &DD[dMPM * numberOfLBnodes];
-      D.f[dMPP] = &DD[dPMM * numberOfLBnodes];
-      D.f[dPPM] = &DD[dMMP * numberOfLBnodes];
-      D.f[dMMM] = &DD[dPPP * numberOfLBnodes];
-      D.f[dPMM] = &DD[dMPP * numberOfLBnodes];
-      D.f[dMPM] = &DD[dPMP * numberOfLBnodes];
-   }
-   ////////////////////////////////////////////////////////////////////////////////
-   const unsigned  x = threadIdx.x;  // Globaler x-Index 
-   const unsigned  y = blockIdx.x;   // Globaler y-Index 
-   const unsigned  z = blockIdx.y;   // Globaler z-Index 
-
-   const unsigned nx = blockDim.x;
-   const unsigned ny = gridDim.x;
-
-   const unsigned k = nx*(ny*z + y) + x;
-   //////////////////////////////////////////////////////////////////////////
-
-   if(k< numberOfBCnodes)
-   {
-      ////////////////////////////////////////////////////////////////////////////////
-      real *q_dirE,   *q_dirW,   *q_dirN,   *q_dirS,   *q_dirT,   *q_dirB, 
-            *q_dirNE,  *q_dirSW,  *q_dirSE,  *q_dirNW,  *q_dirTE,  *q_dirBW,
-            *q_dirBE,  *q_dirTW,  *q_dirTN,  *q_dirBS,  *q_dirBN,  *q_dirTS,
-            *q_dirTNE, *q_dirTSW, *q_dirTSE, *q_dirTNW, *q_dirBNE, *q_dirBSW,
-            *q_dirBSE, *q_dirBNW; 
-      q_dirE   = &QQ[dP00 * numberOfBCnodes];
-      q_dirW   = &QQ[dM00 * numberOfBCnodes];
-      q_dirN   = &QQ[d0P0 * numberOfBCnodes];
-      q_dirS   = &QQ[d0M0 * numberOfBCnodes];
-      q_dirT   = &QQ[d00P * numberOfBCnodes];
-      q_dirB   = &QQ[d00M * numberOfBCnodes];
-      q_dirNE  = &QQ[dPP0 * numberOfBCnodes];
-      q_dirSW  = &QQ[dMM0 * numberOfBCnodes];
-      q_dirSE  = &QQ[dPM0 * numberOfBCnodes];
-      q_dirNW  = &QQ[dMP0 * numberOfBCnodes];
-      q_dirTE  = &QQ[dP0P * numberOfBCnodes];
-      q_dirBW  = &QQ[dM0M * numberOfBCnodes];
-      q_dirBE  = &QQ[dP0M * numberOfBCnodes];
-      q_dirTW  = &QQ[dM0P * numberOfBCnodes];
-      q_dirTN  = &QQ[d0PP * numberOfBCnodes];
-      q_dirBS  = &QQ[d0MM * numberOfBCnodes];
-      q_dirBN  = &QQ[d0PM * numberOfBCnodes];
-      q_dirTS  = &QQ[d0MP * numberOfBCnodes];
-      q_dirTNE = &QQ[dPPP * numberOfBCnodes];
-      q_dirTSW = &QQ[dMMP * numberOfBCnodes];
-      q_dirTSE = &QQ[dPMP * numberOfBCnodes];
-      q_dirTNW = &QQ[dMPP * numberOfBCnodes];
-      q_dirBNE = &QQ[dPPM * numberOfBCnodes];
-      q_dirBSW = &QQ[dMMM * numberOfBCnodes];
-      q_dirBSE = &QQ[dPMM * numberOfBCnodes];
-      q_dirBNW = &QQ[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *nx_dirE,   *nx_dirW,   *nx_dirN,   *nx_dirS,   *nx_dirT,   *nx_dirB, 
-              *nx_dirNE,  *nx_dirSW,  *nx_dirSE,  *nx_dirNW,  *nx_dirTE,  *nx_dirBW,
-              *nx_dirBE,  *nx_dirTW,  *nx_dirTN,  *nx_dirBS,  *nx_dirBN,  *nx_dirTS,
-              *nx_dirTNE, *nx_dirTSW, *nx_dirTSE, *nx_dirTNW, *nx_dirBNE, *nx_dirBSW,
-              *nx_dirBSE, *nx_dirBNW; 
-      nx_dirE   = &NormalX[dP00 * numberOfBCnodes];
-      nx_dirW   = &NormalX[dM00 * numberOfBCnodes];
-      nx_dirN   = &NormalX[d0P0 * numberOfBCnodes];
-      nx_dirS   = &NormalX[d0M0 * numberOfBCnodes];
-      nx_dirT   = &NormalX[d00P * numberOfBCnodes];
-      nx_dirB   = &NormalX[d00M * numberOfBCnodes];
-      nx_dirNE  = &NormalX[dPP0 * numberOfBCnodes];
-      nx_dirSW  = &NormalX[dMM0 * numberOfBCnodes];
-      nx_dirSE  = &NormalX[dPM0 * numberOfBCnodes];
-      nx_dirNW  = &NormalX[dMP0 * numberOfBCnodes];
-      nx_dirTE  = &NormalX[dP0P * numberOfBCnodes];
-      nx_dirBW  = &NormalX[dM0M * numberOfBCnodes];
-      nx_dirBE  = &NormalX[dP0M * numberOfBCnodes];
-      nx_dirTW  = &NormalX[dM0P * numberOfBCnodes];
-      nx_dirTN  = &NormalX[d0PP * numberOfBCnodes];
-      nx_dirBS  = &NormalX[d0MM * numberOfBCnodes];
-      nx_dirBN  = &NormalX[d0PM * numberOfBCnodes];
-      nx_dirTS  = &NormalX[d0MP * numberOfBCnodes];
-      nx_dirTNE = &NormalX[dPPP * numberOfBCnodes];
-      nx_dirTSW = &NormalX[dMMP * numberOfBCnodes];
-      nx_dirTSE = &NormalX[dPMP * numberOfBCnodes];
-      nx_dirTNW = &NormalX[dMPP * numberOfBCnodes];
-      nx_dirBNE = &NormalX[dPPM * numberOfBCnodes];
-      nx_dirBSW = &NormalX[dMMM * numberOfBCnodes];
-      nx_dirBSE = &NormalX[dPMM * numberOfBCnodes];
-      nx_dirBNW = &NormalX[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *ny_dirE,   *ny_dirW,   *ny_dirN,   *ny_dirS,   *ny_dirT,   *ny_dirB, 
-              *ny_dirNE,  *ny_dirSW,  *ny_dirSE,  *ny_dirNW,  *ny_dirTE,  *ny_dirBW,
-              *ny_dirBE,  *ny_dirTW,  *ny_dirTN,  *ny_dirBS,  *ny_dirBN,  *ny_dirTS,
-              *ny_dirTNE, *ny_dirTSW, *ny_dirTSE, *ny_dirTNW, *ny_dirBNE, *ny_dirBSW,
-              *ny_dirBSE, *ny_dirBNW; 
-      ny_dirE   = &NormalY[dP00 * numberOfBCnodes];
-      ny_dirW   = &NormalY[dM00 * numberOfBCnodes];
-      ny_dirN   = &NormalY[d0P0 * numberOfBCnodes];
-      ny_dirS   = &NormalY[d0M0 * numberOfBCnodes];
-      ny_dirT   = &NormalY[d00P * numberOfBCnodes];
-      ny_dirB   = &NormalY[d00M * numberOfBCnodes];
-      ny_dirNE  = &NormalY[dPP0 * numberOfBCnodes];
-      ny_dirSW  = &NormalY[dMM0 * numberOfBCnodes];
-      ny_dirSE  = &NormalY[dPM0 * numberOfBCnodes];
-      ny_dirNW  = &NormalY[dMP0 * numberOfBCnodes];
-      ny_dirTE  = &NormalY[dP0P * numberOfBCnodes];
-      ny_dirBW  = &NormalY[dM0M * numberOfBCnodes];
-      ny_dirBE  = &NormalY[dP0M * numberOfBCnodes];
-      ny_dirTW  = &NormalY[dM0P * numberOfBCnodes];
-      ny_dirTN  = &NormalY[d0PP * numberOfBCnodes];
-      ny_dirBS  = &NormalY[d0MM * numberOfBCnodes];
-      ny_dirBN  = &NormalY[d0PM * numberOfBCnodes];
-      ny_dirTS  = &NormalY[d0MP * numberOfBCnodes];
-      ny_dirTNE = &NormalY[dPPP * numberOfBCnodes];
-      ny_dirTSW = &NormalY[dMMP * numberOfBCnodes];
-      ny_dirTSE = &NormalY[dPMP * numberOfBCnodes];
-      ny_dirTNW = &NormalY[dMPP * numberOfBCnodes];
-      ny_dirBNE = &NormalY[dPPM * numberOfBCnodes];
-      ny_dirBSW = &NormalY[dMMM * numberOfBCnodes];
-      ny_dirBSE = &NormalY[dPMM * numberOfBCnodes];
-      ny_dirBNW = &NormalY[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      real *nz_dirE,   *nz_dirW,   *nz_dirN,   *nz_dirS,   *nz_dirT,   *nz_dirB, 
-              *nz_dirNE,  *nz_dirSW,  *nz_dirSE,  *nz_dirNW,  *nz_dirTE,  *nz_dirBW,
-              *nz_dirBE,  *nz_dirTW,  *nz_dirTN,  *nz_dirBS,  *nz_dirBN,  *nz_dirTS,
-              *nz_dirTNE, *nz_dirTSW, *nz_dirTSE, *nz_dirTNW, *nz_dirBNE, *nz_dirBSW,
-              *nz_dirBSE, *nz_dirBNW; 
-      nz_dirE   = &NormalZ[dP00 * numberOfBCnodes];
-      nz_dirW   = &NormalZ[dM00 * numberOfBCnodes];
-      nz_dirN   = &NormalZ[d0P0 * numberOfBCnodes];
-      nz_dirS   = &NormalZ[d0M0 * numberOfBCnodes];
-      nz_dirT   = &NormalZ[d00P * numberOfBCnodes];
-      nz_dirB   = &NormalZ[d00M * numberOfBCnodes];
-      nz_dirNE  = &NormalZ[dPP0 * numberOfBCnodes];
-      nz_dirSW  = &NormalZ[dMM0 * numberOfBCnodes];
-      nz_dirSE  = &NormalZ[dPM0 * numberOfBCnodes];
-      nz_dirNW  = &NormalZ[dMP0 * numberOfBCnodes];
-      nz_dirTE  = &NormalZ[dP0P * numberOfBCnodes];
-      nz_dirBW  = &NormalZ[dM0M * numberOfBCnodes];
-      nz_dirBE  = &NormalZ[dP0M * numberOfBCnodes];
-      nz_dirTW  = &NormalZ[dM0P * numberOfBCnodes];
-      nz_dirTN  = &NormalZ[d0PP * numberOfBCnodes];
-      nz_dirBS  = &NormalZ[d0MM * numberOfBCnodes];
-      nz_dirBN  = &NormalZ[d0PM * numberOfBCnodes];
-      nz_dirTS  = &NormalZ[d0MP * numberOfBCnodes];
-      nz_dirTNE = &NormalZ[dPPP * numberOfBCnodes];
-      nz_dirTSW = &NormalZ[dMMP * numberOfBCnodes];
-      nz_dirTSE = &NormalZ[dPMP * numberOfBCnodes];
-      nz_dirTNW = &NormalZ[dMPP * numberOfBCnodes];
-      nz_dirBNE = &NormalZ[dPPM * numberOfBCnodes];
-      nz_dirBSW = &NormalZ[dMMM * numberOfBCnodes];
-      nz_dirBSE = &NormalZ[dPMM * numberOfBCnodes];
-      nz_dirBNW = &NormalZ[dMPM * numberOfBCnodes];
-      ////////////////////////////////////////////////////////////////////////////////
-      //index
-      unsigned int KQK  = k_Q[k];
-      unsigned int kzero= KQK;
-      unsigned int ke   = KQK;
-      unsigned int kw   = neighborX[KQK];
-      unsigned int kn   = KQK;
-      unsigned int ks   = neighborY[KQK];
-      unsigned int kt   = KQK;
-      unsigned int kb   = neighborZ[KQK];
-      unsigned int ksw  = neighborY[kw];
-      unsigned int kne  = KQK;
-      unsigned int kse  = ks;
-      unsigned int knw  = kw;
-      unsigned int kbw  = neighborZ[kw];
-      unsigned int kte  = KQK;
-      unsigned int kbe  = kb;
-      unsigned int ktw  = kw;
-      unsigned int kbs  = neighborZ[ks];
-      unsigned int ktn  = KQK;
-      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 = KQK;
-      unsigned int kbsw = neighborZ[ksw];
-      ////////////////////////////////////////////////////////////////////////////////
-      real f_W    = (D.f[dP00])[ke   ];
-      real f_E    = (D.f[dM00])[kw   ];
-      real f_S    = (D.f[d0P0])[kn   ];
-      real f_N    = (D.f[d0M0])[ks   ];
-      real f_B    = (D.f[d00P])[kt   ];
-      real f_T    = (D.f[d00M])[kb   ];
-      real f_SW   = (D.f[dPP0])[kne  ];
-      real f_NE   = (D.f[dMM0])[ksw  ];
-      real f_NW   = (D.f[dPM0])[kse  ];
-      real f_SE   = (D.f[dMP0])[knw  ];
-      real f_BW   = (D.f[dP0P])[kte  ];
-      real f_TE   = (D.f[dM0M])[kbw  ];
-      real f_TW   = (D.f[dP0M])[kbe  ];
-      real f_BE   = (D.f[dM0P])[ktw  ];
-      real f_BS   = (D.f[d0PP])[ktn  ];
-      real f_TN   = (D.f[d0MM])[kbs  ];
-      real f_TS   = (D.f[d0PM])[kbn  ];
-      real f_BN   = (D.f[d0MP])[kts  ];
-      real f_BSW  = (D.f[dPPP])[ktne ];
-      real f_BNE  = (D.f[dMMP])[ktsw ];
-      real f_BNW  = (D.f[dPMP])[ktse ];
-      real f_BSE  = (D.f[dMPP])[ktnw ];
-      real f_TSW  = (D.f[dPPM])[kbne ];
-      real f_TNE  = (D.f[dMMM])[kbsw ];
-      real f_TNW  = (D.f[dPMM])[kbse ];
-      real f_TSE  = (D.f[dMPM])[kbnw ];
-      ////////////////////////////////////////////////////////////////////////////////
-      real vx1, vx2, vx3, drho, feq, q;
-      drho   =  f_TSE + f_TNW + f_TNE + f_TSW + f_BSE + f_BNW + f_BNE + f_BSW +
-                f_BN + f_TS + f_TN + f_BS + f_BE + f_TW + f_TE + f_BW + f_SE + f_NW + f_NE + f_SW + 
-                f_T + f_B + f_N + f_S + f_E + f_W + ((D.f[d000])[kzero]); 
-
-      vx1    =  (((f_TSE - f_BNW) - (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                ((f_BE - f_TW)   + (f_TE - f_BW))   + ((f_SE - f_NW)   + (f_NE - f_SW)) +
-                (f_E - f_W)) / (c1o1 + drho); 
-         
-
-      vx2    =   ((-(f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) - (f_TSW - f_BNE)) +
-                 ((f_BN - f_TS)   + (f_TN - f_BS))    + (-(f_SE - f_NW)  + (f_NE - f_SW)) +
-                 (f_N - f_S)) / (c1o1 + drho); 
-
-      vx3    =   (((f_TSE - f_BNW) + (f_TNW - f_BSE)) + ((f_TNE - f_BSW) + (f_TSW - f_BNE)) +
-                 (-(f_BN - f_TS)  + (f_TN - f_BS))   + ((f_TE - f_BW)   - (f_BE - f_TW)) +
-                 (f_T - f_B)) / (c1o1 + drho); 
-
-      real cu_sq=c3o2*(vx1*vx1+vx2*vx2+vx3*vx3) * (c1o1 + drho);
-
-      //////////////////////////////////////////////////////////////////////////
-      if (isEvenTimestep==false)
-      {
-         D.f[dP00] = &DD[dP00 * numberOfLBnodes];
-         D.f[dM00] = &DD[dM00 * numberOfLBnodes];
-         D.f[d0P0] = &DD[d0P0 * numberOfLBnodes];
-         D.f[d0M0] = &DD[d0M0 * numberOfLBnodes];
-         D.f[d00P] = &DD[d00P * numberOfLBnodes];
-         D.f[d00M] = &DD[d00M * numberOfLBnodes];
-         D.f[dPP0] = &DD[dPP0 * numberOfLBnodes];
-         D.f[dMM0] = &DD[dMM0 * numberOfLBnodes];
-         D.f[dPM0] = &DD[dPM0 * numberOfLBnodes];
-         D.f[dMP0] = &DD[dMP0 * numberOfLBnodes];
-         D.f[dP0P] = &DD[dP0P * numberOfLBnodes];
-         D.f[dM0M] = &DD[dM0M * numberOfLBnodes];
-         D.f[dP0M] = &DD[dP0M * numberOfLBnodes];
-         D.f[dM0P] = &DD[dM0P * numberOfLBnodes];
-         D.f[d0PP] = &DD[d0PP * numberOfLBnodes];
-         D.f[d0MM] = &DD[d0MM * numberOfLBnodes];
-         D.f[d0PM] = &DD[d0PM * numberOfLBnodes];
-         D.f[d0MP] = &DD[d0MP * numberOfLBnodes];
-         D.f[d000] = &DD[d000 * numberOfLBnodes];
-         D.f[dPPP] = &DD[dPPP * numberOfLBnodes];
-         D.f[dMMP] = &DD[dMMP * numberOfLBnodes];
-         D.f[dPMP] = &DD[dPMP * numberOfLBnodes];
-         D.f[dMPP] = &DD[dMPP * numberOfLBnodes];
-         D.f[dPPM] = &DD[dPPM * numberOfLBnodes];
-         D.f[dMMM] = &DD[dMMM * numberOfLBnodes];
-         D.f[dPMM] = &DD[dPMM * numberOfLBnodes];
-         D.f[dMPM] = &DD[dMPM * numberOfLBnodes];
-      } 
-      else
-      {
-         D.f[dM00] = &DD[dP00 * numberOfLBnodes];
-         D.f[dP00] = &DD[dM00 * numberOfLBnodes];
-         D.f[d0M0] = &DD[d0P0 * numberOfLBnodes];
-         D.f[d0P0] = &DD[d0M0 * numberOfLBnodes];
-         D.f[d00M] = &DD[d00P * numberOfLBnodes];
-         D.f[d00P] = &DD[d00M * numberOfLBnodes];
-         D.f[dMM0] = &DD[dPP0 * numberOfLBnodes];
-         D.f[dPP0] = &DD[dMM0 * numberOfLBnodes];
-         D.f[dMP0] = &DD[dPM0 * numberOfLBnodes];
-         D.f[dPM0] = &DD[dMP0 * numberOfLBnodes];
-         D.f[dM0M] = &DD[dP0P * numberOfLBnodes];
-         D.f[dP0P] = &DD[dM0M * numberOfLBnodes];
-         D.f[dM0P] = &DD[dP0M * numberOfLBnodes];
-         D.f[dP0M] = &DD[dM0P * numberOfLBnodes];
-         D.f[d0MM] = &DD[d0PP * numberOfLBnodes];
-         D.f[d0PP] = &DD[d0MM * numberOfLBnodes];
-         D.f[d0MP] = &DD[d0PM * numberOfLBnodes];
-         D.f[d0PM] = &DD[d0MP * numberOfLBnodes];
-         D.f[d000] = &DD[d000 * numberOfLBnodes];
-         D.f[dPPP] = &DD[dMMM * numberOfLBnodes];
-         D.f[dMMP] = &DD[dPPM * numberOfLBnodes];
-         D.f[dPMP] = &DD[dMPM * numberOfLBnodes];
-         D.f[dMPP] = &DD[dPMM * numberOfLBnodes];
-         D.f[dPPM] = &DD[dMMP * numberOfLBnodes];
-         D.f[dMMM] = &DD[dPPP * numberOfLBnodes];
-         D.f[dPMM] = &DD[dMPP * numberOfLBnodes];
-         D.f[dMPM] = &DD[dPMP * numberOfLBnodes];
-      }
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real VeloX = vx1;
-      real VeloY = vx2;
-      real VeloZ = vx3;
-      real fac = c1o100;//0.5;
-       //real phi = c0o1;
-      real alpha = c1o100;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real kxyFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_SW+f_BSW+f_TSW-f_NW-f_BNW-f_TNW-f_SE-f_BSE-f_TSE+f_NE+f_BNE+f_TNE ) / (c1o1 + drho) - ((vx1*vx2)));
-      real kyzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_BS+f_BSE+f_BSW-f_TS-f_TSE-f_TSW-f_BN-f_BNE-f_BNW+f_TN+f_TNE+f_TNW ) / (c1o1 + drho) - ((vx2*vx3)));
-      real kxzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_BW+f_BSW+f_BNW-f_TW-f_TSW-f_TNW-f_BE-f_BSE-f_BNE+f_TE+f_TSE+f_TNE ) / (c1o1 + drho) - ((vx1*vx3)));
-
-      real kxxFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_E+f_NE+f_SE+f_TE+f_BE+f_W+f_NW+f_SW+f_TW+f_BW+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx1*vx1)));
-      real kyyFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_N+f_NE+f_NW+f_TN+f_BN+f_S+f_SE+f_SW+f_TS+f_BS+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx2*vx2)));
-      real kzzFromfcNEQ = -(c3o1 * om1 / (c1o1-om1))*((f_T+f_TE+f_TW+f_TN+f_BS+f_B+f_BE+f_BW+f_BN+f_BS+ f_TNE+f_TSE+f_BNE+f_TNE+ f_TNW+f_TSW+f_BNW+f_TNW ) / (c1o1 + drho) - ((c1o3*drho + vx3*vx3)));
-
-      real magS = sqrtf(kxyFromfcNEQ*kxyFromfcNEQ + kyzFromfcNEQ*kyzFromfcNEQ + kxzFromfcNEQ*kxzFromfcNEQ + kxxFromfcNEQ*kxxFromfcNEQ + kyyFromfcNEQ*kyyFromfcNEQ + kzzFromfcNEQ*kzzFromfcNEQ);
-
-      fac = fac * magS / (c1o3 * (c1o1 / om1 - c1o2));
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real *facAst = &QQ[d000 * numberOfBCnodes];
-
-      fac = fac * alpha + facAst[k] * (c1o1 - alpha);
-      facAst[k] = fac;
-      //(&QQ[d000 * numberOfBCnodes])[KQK] = fac;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      ////real uk = sqrtf(vx1*vx1 + vx2*vx2 + vx3*vx3);
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real phi = expf(magS/0.01f) - one;
-      //phi = (phi > one) ? one:phi;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real C = five;
-      //real kappa = 0.41f;
-      //real phi = (C * kappa * c1o2 * logf(magS / (c1o3 * (one / om1 - c1o2))) - one) / (C * kappa * c1o2 * logf(magS / (c1o3 * (one / om1 - c1o2))));
-      //phi = (phi < zero) ? zero:phi;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      //real sum = zero, count = zero;
-   //   q = q_dirE   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirE[k] ); count += one;
-   //   q = q_dirW   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirW[k])); count += one;
-   //   q = q_dirN   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirN[k] ); count += one;
-   //   q = q_dirS   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirS[k])); count += one;
-   //   q = q_dirT   [k]; if (q>=zero && q<=one) sum += (q *   nx_dirT[k] ); count += one;
-   //   q = q_dirB   [k]; if (q>=zero && q<=one) sum += (q * (-nx_dirB[k])); count += one;
-   //   q = q_dirNE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirNE[k]  + ny_dirNE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirSW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirSW[k]) - ny_dirSW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirSE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirSE[k]  - ny_dirSE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirNW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirNW[k]) + ny_dirNW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTE[k]  + nz_dirTE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBW[k]) - nz_dirBW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBE  [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBE[k]  - nz_dirBE[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTW  [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTW[k]) + nz_dirTW[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTN  [k]; if (q>=zero && q<=one) sum += (q * (  ny_dirTN[k]  + nz_dirTN[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBS  [k]; if (q>=zero && q<=one) sum += (q * ((-ny_dirBS[k]) - nz_dirBS[k])/(sqrtf(two))); count += one;
-   //   q = q_dirBN  [k]; if (q>=zero && q<=one) sum += (q * (  ny_dirBN[k]  - nz_dirBN[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTS  [k]; if (q>=zero && q<=one) sum += (q * ((-ny_dirTS[k]) + nz_dirTS[k])/(sqrtf(two))); count += one;
-   //   q = q_dirTNE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTNE[k] + ny_dirTNE[k] + nz_dirTNE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTSW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTSW[k])- ny_dirTSW[k] + nz_dirTSW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTSE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirTSE[k] - ny_dirTSE[k] + nz_dirTSE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirTNW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirTNW[k])+ ny_dirTNW[k] + nz_dirTNW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBNE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBNE[k] + ny_dirBNE[k] - nz_dirBNE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBSW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBSW[k])- ny_dirBSW[k] - nz_dirBSW[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBSE [k]; if (q>=zero && q<=one) sum += (q * (  nx_dirBSE[k] - ny_dirBSE[k] - nz_dirBSE[k])/(sqrtf(three))); count += one;
-   //   q = q_dirBNW [k]; if (q>=zero && q<=one) sum += (q * ((-nx_dirBNW[k])+ ny_dirBNW[k] - nz_dirBNW[k])/(sqrtf(three))); count += one;
-      //real qMed = sum/count;
-      //real phi = fac / (qMed + fac);
-      //phi = (phi > one) ? one:one;
-      ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-      real sliplength = 0.9f;//c1o2;
-      real qSlip = c0o1;
-      real un = c0o1;
-      real ut = c0o1;
-      real tangential = c0o1;
-      //real cSmallSingle = c0p0000002;
-
-      q = q_dirE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirE[k] + vx2 * ny_dirE[k] + vx3 * nz_dirE[k]) * nx_dirE[k];
-         un = fabs((vx1 * nx_dirE[k] + vx2 * ny_dirE[k] + vx3 * nz_dirE[k]) * nx_dirE[k]);
-         ut = fabs(VeloX);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*( vx1        )*/+c9o2*( vx1        )*( vx1        ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM00])[kw]=(c1o1-q)/(c1o1+q)*(f_E-f_W+(f_E+f_W-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_E+f_W))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirW[k] + vx2 * ny_dirW[k] + vx3 * nz_dirW[k]) * nx_dirW[k];
-         un = fabs(-(vx1 * nx_dirW[k] + vx2 * ny_dirW[k] + vx3 * nz_dirW[k]) * nx_dirW[k]);
-         ut = fabs(-VeloX);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*(-vx1        )*/+c9o2*(-vx1        )*(-vx1        ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP00])[ke]=(c1o1-q)/(c1o1+q)*(f_W-f_E+(f_W+f_E-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_W+f_E))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirN[k] + vx2 * ny_dirN[k] + vx3 * nz_dirN[k]) * ny_dirN[k];
-         un = fabs( (vx1 * nx_dirN[k] + vx2 * ny_dirN[k] + vx3 * nz_dirN[k]) * ny_dirN[k]);
-         ut = fabs( VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( ny_dirN[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*(    vx2     )*/+c9o2*(     vx2    )*(     vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0M0])[ks]=(c1o1-q)/(c1o1+q)*(f_N-f_S+(f_N+f_S-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_N+f_S))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirS[k] + vx2 * ny_dirS[k] + vx3 * nz_dirS[k]) * ny_dirS[k];
-         un = fabs(-(vx1 * nx_dirS[k] + vx2 * ny_dirS[k] + vx3 * nz_dirS[k]) * ny_dirS[k]);
-         ut = fabs(-VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-ny_dirS[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*(   -vx2     )*/+c9o2*(    -vx2    )*(    -vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0P0])[kn]=(c1o1-q)/(c1o1+q)*(f_S-f_N+(f_S+f_N-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_S+f_N))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirT[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = vx3 - (vx1 * nx_dirT[k] + vx2 * ny_dirT[k] + vx3 * nz_dirT[k]) * nz_dirT[k];
-         un = fabs( (vx1 * nx_dirT[k] + vx2 * ny_dirT[k] + vx3 * nz_dirT[k]) * nz_dirT[k]);
-         ut = fabs( VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nz_dirT[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*(         vx3)*/+c9o2*(         vx3)*(         vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d00M])[kb]=(c1o1-q)/(c1o1+q)*(f_T-f_B+(f_T+f_B-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_T+f_B))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirB[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloZ = vx3 - (vx1 * nx_dirB[k] + vx2 * ny_dirB[k] + vx3 * nz_dirB[k]) * nz_dirB[k];
-         un = fabs(-(vx1 * nx_dirB[k] + vx2 * ny_dirB[k] + vx3 * nz_dirB[k]) * nz_dirB[k]);
-         ut = fabs(-VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nz_dirB[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c2o27* (drho/*+three*(        -vx3)*/+c9o2*(        -vx3)*(        -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d00P])[kt]=(c1o1-q)/(c1o1+q)*(f_B-f_T+(f_B+f_T-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_B+f_T))/(c1o1+q) - c2o27 * drho;
-      }
-
-      q = q_dirNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * nx_dirNE[k];
-         VeloY = vx2 - (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * ny_dirNE[k];
-         un = fabs( (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * nx_dirNE[k] + (vx1 * nx_dirNE[k] + vx2 * ny_dirNE[k] + vx3 * nz_dirNE[k]) * ny_dirNE[k]);
-         ut = fabs( VeloX + VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirNE[k]+ny_dirNE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*( vx1+vx2    )*/+c9o2*( vx1+vx2    )*( vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMM0])[ksw]=(c1o1-q)/(c1o1+q)*(f_NE-f_SW+(f_NE+f_SW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NE+f_SW))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * nx_dirSW[k];
-         VeloY = vx2 - (vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * ny_dirSW[k];
-         un = fabs(-(vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * nx_dirSW[k] - (vx1 * nx_dirSW[k] + vx2 * ny_dirSW[k] + vx3 * nz_dirSW[k]) * ny_dirSW[k]);
-         ut = fabs(-VeloX - VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirSW[k]-ny_dirSW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(-vx1-vx2    )*/+c9o2*(-vx1-vx2    )*(-vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPP0])[kne]=(c1o1-q)/(c1o1+q)*(f_SW-f_NE+(f_SW+f_NE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SW+f_NE))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * nx_dirSE[k];
-         VeloY = vx2 - (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * ny_dirSE[k];
-         un = fabs( (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * nx_dirSE[k] - (vx1 * nx_dirSE[k] + vx2 * ny_dirSE[k] + vx3 * nz_dirSE[k]) * ny_dirSE[k]);
-         ut = fabs( VeloX - VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirSE[k]-ny_dirSE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*( vx1-vx2    )*/+c9o2*( vx1-vx2    )*( vx1-vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMP0])[knw]=(c1o1-q)/(c1o1+q)*(f_SE-f_NW+(f_SE+f_NW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_SE+f_NW))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * nx_dirNW[k];
-         VeloY = vx2 - (vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * ny_dirNW[k];
-         un = fabs(-(vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * nx_dirNW[k] + (vx1 * nx_dirNW[k] + vx2 * ny_dirNW[k] + vx3 * nz_dirNW[k]) * ny_dirNW[k]);
-         ut = fabs(-VeloX + VeloY);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirNW[k]+ny_dirNW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(-vx1+vx2    )*/+c9o2*(-vx1+vx2    )*(-vx1+vx2    ) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPM0])[kse]=(c1o1-q)/(c1o1+q)*(f_NW-f_SE+(f_NW+f_SE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_NW+f_SE))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nx_dirTE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nz_dirTE[k];
-         un = fabs( (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nx_dirTE[k] + (vx1 * nx_dirTE[k] + vx2 * ny_dirTE[k] + vx3 * nz_dirTE[k]) * nz_dirTE[k]);
-         ut = fabs( VeloX + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirTE[k]+nz_dirTE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*( vx1    +vx3)*/+c9o2*( vx1    +vx3)*( vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM0M])[kbw]=(c1o1-q)/(c1o1+q)*(f_TE-f_BW+(f_TE+f_BW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TE+f_BW))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nx_dirBW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nz_dirBW[k];
-         un = fabs(-(vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nx_dirBW[k] - (vx1 * nx_dirBW[k] + vx2 * ny_dirBW[k] + vx3 * nz_dirBW[k]) * nz_dirBW[k]);
-         ut = fabs(-VeloX - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirBW[k]-nz_dirBW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(-vx1    -vx3)*/+c9o2*(-vx1    -vx3)*(-vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP0P])[kte]=(c1o1-q)/(c1o1+q)*(f_BW-f_TE+(f_BW+f_TE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BW+f_TE))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nx_dirBE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nz_dirBE[k];
-         un = fabs( (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nx_dirBE[k] - (vx1 * nx_dirBE[k] + vx2 * ny_dirBE[k] + vx3 * nz_dirBE[k]) * nz_dirBE[k]);
-         ut = fabs( VeloX - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirBE[k]-nz_dirBE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*( vx1    -vx3)*/+c9o2*( vx1    -vx3)*( vx1    -vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dM0P])[ktw]=(c1o1-q)/(c1o1+q)*(f_BE-f_TW+(f_BE+f_TW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BE+f_TW))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nx_dirTW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nz_dirTW[k];
-         un = fabs(-(vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nx_dirTW[k] + (vx1 * nx_dirTW[k] + vx2 * ny_dirTW[k] + vx3 * nz_dirTW[k]) * nz_dirTW[k]);
-         ut = fabs(-VeloX + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirTW[k]+nz_dirTW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(-vx1    +vx3)*/+c9o2*(-vx1    +vx3)*(-vx1    +vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dP0M])[kbe]=(c1o1-q)/(c1o1+q)*(f_TW-f_BE+(f_TW+f_BE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TW+f_BE))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * ny_dirTN[k];
-         VeloZ = vx3 - (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * nz_dirTN[k];
-         un = fabs( (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * ny_dirTN[k] + (vx1 * nx_dirTN[k] + vx2 * ny_dirTN[k] + vx3 * nz_dirTN[k]) * nz_dirTN[k]);
-         ut = fabs( VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( ny_dirTN[k]+nz_dirTN[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(     vx2+vx3)*/+c9o2*(     vx2+vx3)*(     vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0MM])[kbs]=(c1o1-q)/(c1o1+q)*(f_TN-f_BS+(f_TN+f_BS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TN+f_BS))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * ny_dirBS[k];
-         VeloZ = vx3 - (vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * nz_dirBS[k];
-         un = fabs(-(vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * ny_dirBS[k] - (vx1 * nx_dirBS[k] + vx2 * ny_dirBS[k] + vx3 * nz_dirBS[k]) * nz_dirBS[k]);
-         ut = fabs(-VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-ny_dirBS[k]-nz_dirBS[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(    -vx2-vx3)*/+c9o2*(    -vx2-vx3)*(    -vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0PP])[ktn]=(c1o1-q)/(c1o1+q)*(f_BS-f_TN+(f_BS+f_TN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BS+f_TN))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirBN[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * ny_dirBN[k];
-         VeloZ = vx3 - (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * nz_dirBN[k];
-         un = fabs( (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * ny_dirBN[k] - (vx1 * nx_dirBN[k] + vx2 * ny_dirBN[k] + vx3 * nz_dirBN[k]) * nz_dirBN[k]);
-         ut = fabs( VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( ny_dirBN[k]-nz_dirBN[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(     vx2-vx3)*/+c9o2*(     vx2-vx3)*(     vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0MP])[kts]=(c1o1-q)/(c1o1+q)*(f_BN-f_TS+(f_BN+f_TS-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BN+f_TS))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTS[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloY = vx2 - (vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * ny_dirTS[k];
-         VeloZ = vx3 - (vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * nz_dirTS[k];
-         un = fabs(-(vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * ny_dirTS[k] + (vx1 * nx_dirTS[k] + vx2 * ny_dirTS[k] + vx3 * nz_dirTS[k]) * nz_dirTS[k]);
-         ut = fabs(-VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-ny_dirTS[k]+nz_dirTS[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o54* (drho/*+three*(    -vx2+vx3)*/+c9o2*(    -vx2+vx3)*(    -vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[d0PM])[kbn]=(c1o1-q)/(c1o1+q)*(f_TS-f_BN+(f_TS+f_BN-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TS+f_BN))/(c1o1+q) - c1o54 * drho;
-      }
-
-      q = q_dirTNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nx_dirTNE[k];
-         VeloY = vx2 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * ny_dirTNE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nz_dirTNE[k];
-         un = fabs( (vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nx_dirTNE[k] 
-                   +(vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * ny_dirTNE[k] 
-                   +(vx1 * nx_dirTNE[k] + vx2 * ny_dirTNE[k] + vx3 * nz_dirTNE[k]) * nz_dirTNE[k]);
-         ut = fabs( VeloX + VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirTNE[k] + ny_dirTNE[k] + nz_dirTNE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*( vx1+vx2+vx3)*/+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMMM])[kbsw]=(c1o1-q)/(c1o1+q)*(f_TNE-f_BSW+(f_TNE+f_BSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNE+f_BSW))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nx_dirBSW[k];
-         VeloY = vx2 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * ny_dirBSW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nz_dirBSW[k];
-         un = fabs(-(vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nx_dirBSW[k] 
-                   -(vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * ny_dirBSW[k] 
-                   -(vx1 * nx_dirBSW[k] + vx2 * ny_dirBSW[k] + vx3 * nz_dirBSW[k]) * nz_dirBSW[k]);
-         ut = fabs(-VeloX - VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirBSW[k] - ny_dirBSW[k] - nz_dirBSW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*(-vx1-vx2-vx3)*/+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPPP])[ktne]=(c1o1-q)/(c1o1+q)*(f_BSW-f_TNE+(f_BSW+f_TNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSW+f_TNE))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBNE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nx_dirBNE[k];
-         VeloY = vx2 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * ny_dirBNE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nz_dirBNE[k];
-         un = fabs( (vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nx_dirBNE[k] 
-                   +(vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * ny_dirBNE[k] 
-                   -(vx1 * nx_dirBNE[k] + vx2 * ny_dirBNE[k] + vx3 * nz_dirBNE[k]) * nz_dirBNE[k]);
-         ut = fabs( VeloX + VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirBNE[k] + ny_dirBNE[k] - nz_dirBNE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*( vx1+vx2-vx3)*/+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMMP])[ktsw]=(c1o1-q)/(c1o1+q)*(f_BNE-f_TSW+(f_BNE+f_TSW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNE+f_TSW))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTSW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nx_dirTSW[k];
-         VeloY = vx2 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * ny_dirTSW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nz_dirTSW[k];
-         un = fabs(-(vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nx_dirTSW[k] 
-                   -(vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * ny_dirTSW[k] 
-                   +(vx1 * nx_dirTSW[k] + vx2 * ny_dirTSW[k] + vx3 * nz_dirTSW[k]) * nz_dirTSW[k]);
-         ut = fabs(-VeloX - VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirTSW[k] - ny_dirTSW[k] + nz_dirTSW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*(-vx1-vx2+vx3)*/+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPPM])[kbne]=(c1o1-q)/(c1o1+q)*(f_TSW-f_BNE+(f_TSW+f_BNE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSW+f_BNE))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nx_dirTSE[k];
-         VeloY = vx2 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * ny_dirTSE[k];
-         VeloZ = vx3 - (vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nz_dirTSE[k];
-         un = fabs(+(vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nx_dirTSE[k] 
-                   -(vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * ny_dirTSE[k] 
-                   +(vx1 * nx_dirTSE[k] + vx2 * ny_dirTSE[k] + vx3 * nz_dirTSE[k]) * nz_dirTSE[k]);
-         ut = fabs(+VeloX - VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirTSE[k] - ny_dirTSE[k] + nz_dirTSE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*( vx1-vx2+vx3)*/+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMPM])[kbnw]=(c1o1-q)/(c1o1+q)*(f_TSE-f_BNW+(f_TSE+f_BNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TSE+f_BNW))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nx_dirBNW[k];
-         VeloY = vx2 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * ny_dirBNW[k];
-         VeloZ = vx3 - (vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nz_dirBNW[k];
-         un = fabs(-(vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nx_dirBNW[k] 
-                   +(vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * ny_dirBNW[k] 
-                   -(vx1 * nx_dirBNW[k] + vx2 * ny_dirBNW[k] + vx3 * nz_dirBNW[k]) * nz_dirBNW[k]);
-         ut = fabs(-VeloX + VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirBNW[k] + ny_dirBNW[k] - nz_dirBNW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*(-vx1+vx2-vx3)*/+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPMP])[ktse]=(c1o1-q)/(c1o1+q)*(f_BNW-f_TSE+(f_BNW+f_TSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BNW+f_TSE))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirBSE[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nx_dirBSE[k];
-         VeloY = vx2 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * ny_dirBSE[k];
-         VeloZ = vx3 - (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nz_dirBSE[k];
-         un = fabs( (vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nx_dirBSE[k] 
-                   -(vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * ny_dirBSE[k] 
-                   -(vx1 * nx_dirBSE[k] + vx2 * ny_dirBSE[k] + vx3 * nz_dirBSE[k]) * nz_dirBSE[k]);
-         ut = fabs( VeloX - VeloY - VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs( nx_dirBSE[k] - ny_dirBSE[k] - nz_dirBSE[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*( vx1-vx2-vx3)*/+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dMPP])[ktnw]=(c1o1-q)/(c1o1+q)*(f_BSE-f_TNW+(f_BSE+f_TNW-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_BSE+f_TNW))/(c1o1+q) - c1o216 * drho;
-      }
-
-      q = q_dirTNW[k];
-      if (q>=c0o1 && q<=c1o1)
-      {
-         VeloX = vx1 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nx_dirTNW[k];
-         VeloY = vx2 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * ny_dirTNW[k];
-         VeloZ = vx3 - (vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nz_dirTNW[k];
-         un = fabs(-(vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nx_dirTNW[k] 
-                   +(vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * ny_dirTNW[k] 
-                   +(vx1 * nx_dirTNW[k] + vx2 * ny_dirTNW[k] + vx3 * nz_dirTNW[k]) * nz_dirTNW[k]);
-         ut = fabs(-VeloX + VeloY + VeloZ);
-         tangential = ut / (ut + un + cSmallSingle);
-         qSlip = sliplength * fabs(-nx_dirTNW[k] + ny_dirTNW[k] + nz_dirTNW[k]);        //sliplength * e_i * n_i
-         //qSlip = (qSlip < zero) ? zero:qSlip;
-         //tangential = (tangential > one) ? one:tangential;
-         q = (q + qSlip)/(c1o1 + qSlip * (c1o1 - tangential) / (cSmallSingle + q));
-         feq=c1o216*(drho/*+three*(-vx1+vx2+vx3)*/+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3) * (c1o1 + drho)-cu_sq); 
-         (D.f[dPMM])[kbse]=(c1o1-q)/(c1o1+q)*(f_TNW-f_BSE+(f_TNW+f_BSE-c2o1*feq*om1)/(c1o1-om1))*c1o2+(q*(f_TNW+f_BSE))/(c1o1+q) - c1o216 * drho;
-      }
-   }
-}
-////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////